
Service組件詳解.png
生命周期
service的生命周期相對(duì)activity來(lái)說(shuō)比較簡(jiǎn)單,一個(gè)servcie的生命周期從創(chuàng)建到銷(xiāo)毀有兩條路徑:
- started servcie
當(dāng)其他的組件調(diào)用startService()時(shí)候service被創(chuàng)建,之后這個(gè)service一直運(yùn)行直到它自己調(diào)用stopSerlf()或者其他的組件調(diào)用stopService() - bound servcie
當(dāng)前他組件調(diào)用bindServcie的時(shí)候service被創(chuàng)建,client可以IBinder接口和service通信,client也可以通過(guò)調(diào)用unbindService()來(lái)關(guān)閉連接,多個(gè)client可以綁定到同一個(gè)service,只有當(dāng)所有的clint都解綁service之后,系統(tǒng)才會(huì)銷(xiāo)毀service。這種情況下service不需要stop它自己。 - 這兩種路徑并不是完全獨(dú)立的,你可以綁定一個(gè)已經(jīng)started的service,例如你可以通過(guò)調(diào)用startService()來(lái)啟動(dòng)一個(gè)后臺(tái)service播放音樂(lè)。然后你可以通過(guò)調(diào)用bindService()來(lái)使activity綁定這個(gè)service,用戶(hù)就可以控制播放器的播放以及獲得當(dāng)前音樂(lè)相關(guān)的信息。這種情況下stopService()和stopSelf()不能真正銷(xiāo)毀這個(gè)service,除非所有的clinets接觸綁定。

service_lifecycle.png
如需了解Bound Service的詳細(xì)信息,請(qǐng)參閱 Bound Service詳解
基本知識(shí)點(diǎn)細(xì)節(jié)
- 同一個(gè)Service,onCreate()和onDestroy()只會(huì)走一遍。
- 每次調(diào)用onStartService()方法,都會(huì)回調(diào)onStartCommand(Intent intent, int flags, int startId)方法。
- bindService()方法的回調(diào)onServiceConnected()是異步的。
- 只有第一次調(diào)用bindService()方法會(huì)回調(diào)onBind(Intent intent)的方法。
- 同一個(gè)Activity實(shí)例多次重復(fù)調(diào)用bindService()方法,只會(huì)創(chuàng)建一次連接(只會(huì)bind一次),也就是只有第一次會(huì)回調(diào)onServiceConnected()方法。
- 如果某個(gè)Activity已經(jīng)bindService了,必須在Activity.onDestory()生命周期或之前unbindService,否則拋出以下異常:
${ActivityName} has leaked ServiceConnection ${ServiceConnectionName} that was originally bound here
- 只有所有client都調(diào)用了unbindService才會(huì)走onBind()生命周期回調(diào),如果只是一個(gè)bound service,此時(shí)才會(huì)走onDestroy生命周期。
- 如果一個(gè)service即使start service又是bound service,只有所有的client都解綁了,在調(diào)用stopService或者stopSelf才會(huì)走onDestroy生命周期。
- 如果Service實(shí)現(xiàn)onUnbind返回true,且一個(gè)started service 第一次bind之后再u(mài)nbind,第二次bind時(shí)不會(huì)走onBind生命周期,而是走onRebind()的生命周期。