1. 普通方式啓動服務
即調用 startService, 依次執行 onCreate、onStartCommand 方法, 調用 stopService 方法停止服務時, 執行 onDestroy 方法。
2. 綁定啓動方式
- 立即綁定
bindService, 依次執行 onCreate、onBind、onServiceConnected, 解綁執行: unBind、onDestroy - 延遲綁定, 即普通方式啓動服務之後,再執行綁定,
bindService 依次執行 onBind、onServiceConnected、onUnbind(解綁執行) 或 onRebind、onUnbind(解綁執行)
note:
- 當 onUnbind 返回 false 時,onBind、unBind 只會調一次。
- 當 onUnbind 返回 true 時,第一次走: onBind、unBind, 第二次走: onRebind、onUnbind, 第三次、第N次同第二次。3. 當 targetSdkVersion < 5(Build.VERSION_CODES.ECLAIR) 時, onStartCommand 返回START_STICKY_COMPATIBILITY, 否則返回 START_STICKY
- 當以普通方式啓動服務後,再讓應用進入後台,一分鐘後,服務可能自動執行 onDestroy
- onServiceDisconnected 不會在 unbindService 時回調,和 onServiceConnected 不是嚴格對應的unbindService 調用後,客户端代碼仍然通過緩衝的 binder 引用調用服務端代碼
- 多次調用 startService, 會多次執行 onStartCommand, 但實際上每個服務只有一個實例, 只需要一次 stopService 即可
- 如果一個服務即被 startService, 也被 bindService,必須調用 stopService, unbindService 之後, onDestroy 才會觸發。
- 服務在應用進入後台後被銷燬後是否能恢復?
START_STICKY:系統會在內存可用時嘗試重新創建服務。實際中並不一定 !!!建議使用 WorkManager