startService, bindService區別和總結

service有2種啓動方式,startService和bindService。知識點包括以下幾個方面(這裏只說一些網上沒有的):

一. 生命週期
(一) startService生命週期
1. onCreate() –> onStartCommand –> onDestroy()。
2. startService 在多個context裏多次調用,只有第一次會調用service的onCreate(),所有的context調用startService都會重複調用service的onStartCommand(Intent intent, int flags, int startId),並且每次startId數字逐次遞增,並且的調用的service是同一個對象實例(即第一次創建的那個)。
3. 一旦利用startService啓動service,那麼不管調用者context的生命週期是否結束(例如finish),service依然在後臺運行,直至調用stopService,這是會回調service的onDestroy(),service的生命週期結束。
4. stopService(intent)可以多次調用且不報錯,但是隻有第一次能夠起作用,調用到service的onDestroy()。

(二) bindService生命週期
1. onCreate() –> onBind() [ Activity–> onServiceConnected]–> onUnbind()。bindService方法在onCreate之前會調用service的構造函數,但是startService方法不會。
2. bindService在多個context裏多次調用,只有第一次調用會調用service裏的onCreate()和onBind()。後續的都不會觸發這2個方法。
3. 利用bindService啓動service之後,調用者如果生命週期結束(比如finish),那麼會自動調用service的onDestroy(),但是service必須要所有bind/start過它的全部unbind/stop了纔會結束生命週期。要注意service生命週期結束之前一定要記得調用unbindService(conn),否則會出現 leaked ServiceConnection錯誤。
4. unbindService(conn)只能調用一次,否則程序會崩潰。
5. onServiceDisconnected只會在service意外退出時調用,記得在這裏回收一些資源。

二. 控制service
另外,我認爲利用startService完全可以在任何Activity裏來控制被啓動過的service來做不同的事情,而不是網上說的完全失去了控制,因爲我們完全可以利用intent帶過去不同的值,在service裏的onStartCommand裏來判斷intent裏帶來的值,從而達到控制的效果,經過測試時完全可以的,因爲不同的activity之間利用startService啓動的service是同一個對象實例。

三. 使用場景
一般說來,bindService使用的場景比較多。另外,混合使用的場景下,只有當所有的調用者釋放掉一個service的bind引用(即unbindService),這個時候再用stopService(或者先stopService再釋放所有的bind引用),這個service纔會結束生命週期。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章