Service 做爲 Android 的四大組件仍是頗有必要好好掌握一下的!微信
先從 Service 生命週期看起,Service 的生命週期比較有趣的一點是,它的生命週期會根據調用不一樣的方法啓動有不一樣的表現,具體有兩種形式。code
經過 startService(Intent intent) 啓動 Servicecdn
生命週期是這樣的: onCreate()
、onStartCommand()
、onStart()(已通過時)
、onDestroy()
生命週期
經過 bindService(Intent intent,ServiceConnection conn,int flags) 啓動 Serviceget
生命週期是這樣的:bindService()
、onCreate()
、IBinder onBind(Intent intent)
、unBindService()
、onDestroy()
方法。it
前面說了,經過 startService()
啓動 Service 會執行 onCreate()
、onStartCommand()
、onDestroy()
方法。注意:當調用 startService(Intent intent) 後,以後只執行一次 onCreate()
方法,反覆屢次調用 startService 後,Service 只會重複執行 onStartCommand
onStart()(已通過時)
方法。調用 stopService 後 Service 只執行一次 onDestroy
方法。io
能夠看到經過這種方式啓動 Service ,這個時候的 Service 幾乎和 Activity 不能交互(不考慮全局變量的方式),在 Service 裏面也沒有 getIntent()
方法。class
既然經過 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 方法。
BIND_AOUT_CREATE
表示在 Activity 和 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 效果是同樣的。
以上是簡單概念,還有下篇。