Service 作為 Android 的四大組件還是很有必要好好掌握一下的!
Service 生命週期
先從 Service 生命週期看起,Service 的生命週期比較有趣的一點是,它的生命週期會根據調用不同的方法啟動有不同的表現,具體有兩種形式。
通過 startService(Intent intent) 啟動 Service生命週期是這樣的: onCreate() 、onStartCommand()、onStart()(已經過時)、onDestroy()通過 bindService(Intent intent,ServiceConnection conn,int flags) 啟動 Service生命週期是這樣的:bindService()、onCreate() 、IBinder onBind(Intent intent)、unBindService()、onDestroy() 方法。通過 startService 啟動
前面說了,通過 startService() 啟動 Service 會執行 onCreate()、onStartCommand()、onDestroy() 方法。注意:當調用 startService(Intent intent) 後,之後只執行一次 onCreate() 方法,反覆多次調用 startService 後,Service 只會重複執行 onStartCommand onStart()(已經過時) 方法。調用 stopService 後 Service 只執行一次 onDestroy 方法。
可以看到通過這種方式啟動 Service ,這個時候的 Service 幾乎和 Activity 不能交互(不考慮全局變量的方式),在 Service 裡面也沒有 getIntent() 方法。
通過 bindService 啟動
既然通過 startService 啟動的 Service 和 Activity 沒有建立聯繫,那麼通過 bindService 來啟動 Service,就可以和 Activity 建立聯繫了,相當於 Service 綁定到了這個 Activity 中了。
通過 bindService(Intent intent ,ServiceConnection connetion,int flag) 啟動 Service 後 Service 的正常的生命週期是:onCreate、onBind、ibinder 會作為參數傳遞到 connect 中的 onServiceConnected 方法中,綁定後,再次執行 bindService Service 什麼都不執行。
Activity 在沒有 bindService 的情況下,調用 unBindService(ServiceConnection serviceConnection) 是會 crash 的。無論在什麼情況下,對於某個 Activity,只能夠執行一次 unBindService。因為執行完一次 Service就不再註冊 serviceConnection 了,再次 unBinderService 就會出現錯誤 Service not registered:MainActivity$ServiceConnection$ 只有在單獨執行 bindService (執行 bindService 前後沒有執行 startService)的情況下,執行 unBindService 才會正常執行 Service 的 onDestroy 方法。
宿主 Activity 退出,不會正常執行 Service 的 onDestroy 方法。
關於 binSerive(Intent intent,ServiceConnection connection,int flag) 中的參數
第一個參數就是要綁定的 Service 的intent 就不多說了第二個參數就是 Service 和 Activity 建立聯繫使用的標誌位,和啟動的 Service 的優先級有關,一般就是傳入:BIND_AOUT_CREATE 表示在 Activity 和 Service建立關聯後自動創建 Service。其實上面的標誌位目前作用不大,這個階段大可不必細究。但是為了滿足心理需要,我還是大體解釋一下可以使用的參數。(放到下一篇吧)
關於 Service 啟動總結
上面介紹的都是在單獨執行 startService 或者 binService 的情況下。
當既執行了 startService 又執行了 binService 的時候(不區分順序),只有執行過 stopService 和unBindService 的時候(不區分順序)才執行 onDestroy 方法。
以上是簡單概念,還有下篇。