Activity與Service的一些總結

Service 生命周期探討


?啟動Service有兩種方式,一種是用 startService,另一種是 bindService ,這里不討論生命周期流程,而是討論兩種啟動方式單獨使用和混合使用時 Service 狀態的變化。我們可以在這些方法中加上Log來驗證生命周期,經過我的嘗試,單獨使用 startService stopService,流程是 onCreate--onStartCommand--onDestroy. 單獨使用 bindService ,流程是 onCreate--onBind--onUnbind--onDestroy. 倘若先用 StartService 再用 bindService ,onCreate方法只運行一次,這時無論使用 unbindService 還是 stopService ,服務都不會銷毀,要同時滿足兩個條件才能銷毀,更多的信息可以運行我文章結尾的Demo驗證

startService 和 bindService 一些區別總結


StartService方法只要一個 Intent 來啟動即可,啟動服務后服務將一直在后臺運行,即使 Activity 銷毀依然存在.
bindService方法主要參數有兩個,Intent ,ServiceConnection,其中ServiceConnection作用是 Activity 和 Service 建立連接時通信使用 ,當我們的Activity和Service 綁定時,系統將會調用 ServiceConnection 的 onServiceConnected 方法,我們可以從該方法的 IBinder 參數中獲取Service 的相關數據,這個IBinder 就是 onBind()方法 return 的,值得注意的是,假如沒有先 startService,bindService后綁定的最后一個 Activity 銷毀時,service也將銷毀,且bindService后的Service 在系統 Running 任務管理器下是看不見的。但先startService,接著 bindService 時,系統 Running 任務管理器顯示該服務,Service 解綁后,onDestroy并不會得到運行

使用 Service 的一些注意事項


  1. Service 時雖然用戶不可見,但是和 Activity 都在主線程,在做一些耗時任務時應該啟動 線程,不然會引起界面停止,ANR錯誤
  2. 雖然 Activity 銷毀時,綁定的 Service 會自動銷毀,但是會顯示有異常,查閱后要在 Activity 的 onDestroy方法中 unbindService 才解決,當然這里,要加上判斷,不然沒有綁定就退出也會報異常
  1. 暫時沒想到,有了再補充

Service 更新 UI 的一些總結



?在我的 Demo 中,Service 里面模擬下載任務,利用 觀察者模式,下載進度更新時主動提醒 Activity 處理,這里有一個問題,假如在 回調方法 中直接更新UI,因為 線程 的原因會報錯,這里就用到 Handler 來解決這個問題


?還遇到了另一個問題,假如我們 bindService 后開始后臺的下載任務,任務還未完成就銷毀了Service,這時 Thread 里面的任務就會報錯,我們必須在 Service onDestroy時停止 Thread 里面的任務,這時候 內部類的好處就顯示了,由于我們的 downTask 類是在 Service 里面的,可以 service 的 onDestroy 方法中增加布爾值來標記銷毀狀態,Thread里面的任務根據該布爾值的變化決定是否退出任務,代碼如下

Service銷毀時

Demo的Github地址: https://github.com/RunHuaOil/AndroidPractice/tree/master/ServiceTest

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容