Android Service 詳解(上)

Service 作為 Android 的四大組件還是很有必要好好掌握一下的!

Service 生命週期

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

  1. 通過 startService(Intent intent) 啟動 Service
  2. 生命週期是這樣的: onCreate() 、onStartCommand()、onStart()(已經過時)、onDestroy()
  3. 通過 bindService(Intent intent,ServiceConnection conn,int flags) 啟動 Service
  4. 生命週期是這樣的: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 方法。

任何一個 Service 在整個應用程序範圍內都是通用的。即 MyService 不僅可以和 MainActivity 建立關聯,還可以和任何一個 Activity 建立關聯。如果 Service 和多個 Activity 綁定,則只有這個 Service 與 所有 Activity 接觸綁定後,才會執行 onDestroy 方法。(如果 Activity 被銷燬了,也認為 Service 和這個 Activity 解除了綁定)如果在某個 Activity 調用 startService 後,Service 就被啟動了,這個時候,無論你在哪個 Activity 內再調用 startService 效果就和上面分析的多次調用 Service 效果是一樣的。

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


分享到:


相關文章: