Android Service 詳解(上)

Android Service 詳解(上)

Service 做爲 Android 的四大組件仍是頗有必要好好掌握一下的!微信

Service 生命週期

先從 Service 生命週期看起,Service 的生命週期比較有趣的一點是,它的生命週期會根據調用不一樣的方法啓動有不一樣的表現,具體有兩種形式。code

  1. 經過 startService(Intent intent) 啓動 Servicecdn

    生命週期是這樣的: onCreate()onStartCommand()onStart()(已通過時)onDestroy()生命週期

  2. 經過 bindService(Intent intent,ServiceConnection conn,int flags) 啓動 Serviceget

    生命週期是這樣的:bindService()onCreate()IBinder onBind(Intent intent)unBindService()onDestroy() 方法。it

經過 startService 啓動

前面說了,經過 startService() 啓動 Service 會執行 onCreate()onStartCommand()onDestroy() 方法。注意:當調用 startService(Intent intent) 後,以後只執行一次 onCreate() 方法,反覆屢次調用 startService 後,Service 只會重複執行 onStartCommand onStart()(已通過時) 方法。調用 stopService 後 Service 只執行一次 onDestroy 方法。io

能夠看到經過這種方式啓動 Service ,這個時候的 Service 幾乎和 Activity 不能交互(不考慮全局變量的方式),在 Service 裏面也沒有 getIntent() 方法。class

經過 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 什麼都不執行。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 方法。

任何一個 Service 在整個應用程序範圍內都是通用的。即 MyService 不只能夠和 MainActivity 創建關聯,還能夠和任何一個 Activity 創建關聯。若是 Service 和多個 Activity 綁定,則只有這個 Service 與 全部 Activity 接觸綁定後,纔會執行 onDestroy 方法。(若是 Activity 被銷燬了,也認爲 Service 和這個 Activity 解除了綁定)若是在某個 Activity 調用 startService 後,Service 就被啓動了,這個時候,不管你在哪一個 Activity 內再調用 startService 效果就和上面分析的屢次調用 Service 效果是同樣的。

以上是簡單概念,還有下篇。

歡迎你們關注個人微信公衆號,和我交流分享
相關文章
相關標籤/搜索