先談談Android四大組件
Service是Android系統中的四大組件之一,它是一種長生命週期的,沒有可視化界面,運行於後臺的一種服務程序。Service必須在AndroidManifest.xml中聲明。Service有自己的聲明週期,可以使用startService啓動一個Service或使用bindServcie()方法綁定一個已經存在的Service。
Service的生命週期沒有Activity那麼複雜,它只繼承了onCreate,onStart(),onDestroy()三個方法,當第一次啓動Service時,先後調用了onCreate(),onStart()這兩個方法,當停止Service時,則執行onDestroy方法,這裏需要注意的是,如果Service已經啓動了,當我們再次啓動Service時,不會再執行onCreate方法,而是直接執行onStart()方法。
Service的啓動方法
Service的有兩種啓動方式:Context.startService()和Context.bindService(),這兩種方式對Service生命週期的影響是不同的。
1,Context.startService()方式啓動
Context.startService()方式的生命週期
啓動時:startService------------->onCreate()-------------------->onStart()
停止時:stopServcie-------------->onDestroy()
如果調用者直接退出而沒有停止Service,則Service會一直會在後臺運行
Context.startService()方法啓動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接着調用onStarte()方法。
如果調用startService()方法前服務已經被創建,多次調用startService()方法並不會導致多次創建服務,但會導致多次調用onStart()方法。採用startService()方法啓動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。
代碼如下:
Intent intent=new Intent();
Intent.setAction("com.my.action.My_SERVICE");
//啓動服務 startService(intent);
//停止一個Service stopService(intent);
2.Context.bindService()方式啓動:
Context.bindService()方式的生命週期:
綁定時:bingService()---------->onCreate()------------------>onBind()
調用者退出了,即解綁定時:
Service就會unbindService()------------------->onUnbind()--------------------->onDestroy()
用Context.bindService()方法啓動服務,在服務未被創建時,系統就會先調用服務的onCreate()方法,接着調用onBind()方法
。這個時候調用者和服務綁定在一起。
調用者退出了,系統就會調用服務的onUnbind()方法,接着調用onDestroy()方法。如果調用bindService()方法前服務已經被綁定,多次調用用bindService()
方法並不會導致多次創建服務及綁定(也就是說onCreate()和onBind()方法不會被多次調用)。
如果調用希望與正在綁定的服務解除綁定,可以調用unbindService()方法,調用該方法也會導致系統調用服務的onUnbind()------>onDestroy()方法。
綁定Service需要三個參數:bindService(intent,conn,Servcie.BIND_AUTO_CREATE)
第一個:Intent對象
第二個:ServiceConnection對象,創建該對象要實現它的onServiceConnected()和onServiceDisconnected()來監聽Service連接和斷開消息。
//連接對象
ServiceConnection conn=new ServiceConnncetion(){
//連接調用
public void onServiceConnected(ComponentName name,IBinder service){
Log.i("Service",“連接成功”);
}
//斷開時調用
public void onServiceDisconnectied(ComponentName name){
Log.i("Services","斷開連接");
}
}
第三個:創建Service方法,一般指定綁定的時候自動創建
理解Service生命週期視圖:
Service使用需要注意的問題:
1,ServiceConnection的回調方法onServiceDisconnected()在連接正常關閉的情況下是不會被調用的,該
方法只在Service被破壞了或者被殺死的時候調用。例如,系統資源不足,要關閉一些Service,剛好連接綁定
的Service是關閉者之一,這個時候onServiceDisconected()就會被調用。
2,如果Service和調用者不是在同一個進程,則不可以在ServiceConnection的回調方法onServiceConnected中
將Service強制類型轉換,在Debug中可以發現onServiceConnected的Service的類型爲BinderProxy.