1. 簡單情形
1.1 startService() -> stopService()
- 調(diào)用 startService() 啟動服務(wù):
onCreate() -> onStartCommand()
之后再多次調(diào)用 startService(),只會觸發(fā) onStartCommand。任何 Service 都會在系統(tǒng)層面被實現(xiàn)為一個單例,保證同一個 Service 類只會存在一個實例,所以多次調(diào)用不會創(chuàng)建多個 Service 實例, onCreate 方法只在初次調(diào)用 startService() 時觸發(fā)。
- 調(diào)用 stopService() 關(guān)閉服務(wù):
onDestroy()
1.2 bindService() -> unbindService()
- 調(diào)用 bindService() 啟動并綁定服務(wù):
onCreate() -> onBind() -> ServiceConnection.onServiceConnected()
注意:
如果要通過 bindService() 啟動一個服務(wù),最后的 flag 參數(shù)必須傳 BIND_AUTO_CREATE。
如果 Service 的 onBind() 方法返回 null,那么 ServiceConnection.onServiceConnected() 也不會被調(diào)用
如果 bindService() 啟動服務(wù)之后,又有其他的客戶端調(diào)用 bindService() 綁定服務(wù),則只會觸發(fā) ServiceConnection.onServiceConnected()
- 調(diào)用 unbindService() 解綁服務(wù):
onUnbind() -> onDestroy()
注意:
如果 bindService() 啟動服務(wù)之后,又有其他的客戶端調(diào)用綁定又解綁服務(wù)時,不會觸發(fā)任何回調(diào)。要等到最初啟動服務(wù)的客戶端解綁,才會觸發(fā)上面的回調(diào)。
2. 復(fù)雜情形
2.1 startService() -> bindService() -> stopService()
-> onBind() -> ServiceConnection.onServiceConnected()
-> ServiceConnection.onServiceDisconnected() -> onUnbind() -> onDestroy()```
**注意**:
這里 bindService() 的 flag 不能設(shè)為 ```BIND_AUTO_CREATE```,否則只調(diào)用 stopService() 沒有任何效果,需要同時調(diào)用 stopService() 和 unbindService() (順序無所謂)之后,才會觸發(fā) ```onUnbind() -> onDestroy()```,并且不會觸發(fā) ```ServiceConnection.onServiceDisconnected()```。也就是正常的姐解綁不會觸發(fā) ```ServiceConnection.onServiceDisconnected()```,只有綁定一個由 startService() 啟動的服務(wù),然后服務(wù)又被 stopService() 關(guān)閉時,才會觸發(fā) ```ServiceConnection.onServiceDisconnected()```
####2.1 bindService() -> startService() -> stopService() + unbindService()
```onCreate() -> onBind() -> ServiceConnection.onServiceConnected()
-> onStartCommand()
-> onUnbind() -> onDestroy()```
**注意**:
因為用 bindService 啟動服務(wù),flag 必然設(shè)為了 ```BIND_AUTO_CREATE```,所以要徹底關(guān)閉服務(wù),必須同時調(diào)用 stopService() 和 unbindService()
###總結(jié)
* 一個服務(wù)的生命周期中,onCreate(),onBind(),onUnbind() 和 onDestroy() 只會被調(diào)用一次,而 onStartCommand() 會被多次調(diào)用。
* 如果bindService() 時,flag 被設(shè)為了 ```BIND_AUTO_CREATE```,那么不管該 Service 是如何啟動的,它都沒辦法被 stopService() 命令強行中斷
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。