服務Service
就是默默運行在后臺的組件,可以理解為是沒有前臺的activity,適合用來運行不需要前臺界面的代碼
服務可以被手動關閉,不會重啟,但是如果被自動關閉,內存充足就會重啟
開啟服務的兩種方式
服務對象是不可以被new滴,只能依靠系統來創建服務對象
-
startService()
- 該方法啟動的服務所在的進程屬于服務進程。
- 服務一旦啟動,服務便和活動沒有關系
-
bindService()
- 該方法啟動的服務所在的進程不屬于服務進程。
- Activity與服務建立連接,服務與啟動它的Activity同生共死
- 任何一個服務在整個應用程序范圍內都是通用的,單例設計模式,一個服務可以和多個Activity綁定
- 綁定服務和解綁服務的生命周期方法:
onCreate
->onBind
->onUnbind
->onDestroy
活動和服務進行通信
使用
startService()
方式啟動服務,服務是不能和活動進行通信,必須使用bindService()
方式啟動服務(活動和服務進行綁定),才可以實現活動和服務進行通信
-
調用
bindService (Intent service, ServiceConnection conn, int flags)
方法將活動和服務進行綁定,此綁定方法有三個參數Intent service
:Intent意圖對象ServiceConnection conn
:活動和服務的連接對象ServiceConnection
-
int flags
:一個標志位Intent intent = new Intent(this, MyService.class); bindService(intent, conn, BIND_AUTO_CREATE);
-
實現
ServiceConnection
接口,創建一個子類,實現接口的兩個方法:onServiceConnected(ComponentName name, IBinder service)
和onServiceDisconnected(ComponentName name)
onServiceConnected(ComponentName name, IBinder service)
:服務連接成功時,此方法被調用-
onServiceDisconnected(ComponentName name)
:服務失去連接時,此方法被調用class MyConnection implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { //綁定服務時,返回的Binder對象 broker = (Broker)service; } @Override public void onServiceDisconnected(ComponentName name) { }
}
``` -
調用
bindService()
方法將活動和服務進行綁定,綁定的服務類中的public IBinder onBind(Intent intent)
方法會被系統調用,傳入的參數是綁定給服務的Activity
,方法返回的是一個IBinder
對象,此對象可通過連接對象中的onServiceConnected(ComponentName name, IBinder service)
方法的參數IBinder service
向下轉型得到,通過此對象就可以實現活動和服務進行通信class Broker extends Binder{ public void work(){ money(); } }
兩種啟動模式的混合使用
使用
startService()
方法啟動的服務所在的進程屬于服務進程,但活動和服務并沒有進行連接,也無法去調用服務里的方法;使用bindService()
方法啟動的服務所在的進程不屬于服務進程,服務和啟動此活動的服務同生共死,活動和服務進行了連接,可以調用服務內部的方法。
兩種啟動方式混合使用,調用
startService()
是為了使服務所在的進程屬于服務進程,調用bindService()
是為了可以和服務進行通信先調用
startService()
方法創建并啟動服務,再調用bindService()
方法綁定服務,欲銷毀時,先調用unbindService()
方法解綁服務,再調用stopService
銷毀服務