1 Service 是什麼,有什麼作用
Service 是不與用戶交互,再後臺運行的一個組件。因爲是在後臺運行,所以 Service 多用於處理耗時任務,或者需要在後臺不被打擾的任務,如音樂播放、錄音等等。
2 如何使用 Service
前面說了什麼是 Service ,那我們來說說如何使用。
Service 的生命週期函數
- onCreate() 方法,第一次被創建的時候調用,一般用來做初始化操作。
- onBind() 方法,抽象函數,必須要實現。返回一個和服務通信的信道,一般用來獲取 service 實例。
- onStartCommand() 方法,接受傳入的 Intent,需要注意的是不能做耗時的操作。
- onDestory() 方法。Service 退出時候會調用,釋放資源的操作一般在這裏。
註冊 service
首先每個組件都需要在清單文件 AndroidManifest.xml 中註冊,Service 也不例外,Service 的註冊可參考如下代碼。
<manifest ... >
...
<application ... >
<service
android:name="packagename.DemoService"
... />
...
</application>
</manifest>
啓動 Service
然後是啓動一個 Service ,啓動的話,一般有 2 種方法。
- 調用 startService( Intent intent ) 方法
- 調用 bindService(Intent service, ServiceConnection conn, int flags)
這兩種方式是有區別的,我們先說 startService() 方法。
startService() 啓動方式
這種啓動方式啓動的 service 會在後臺一直運行(忽略系統因內存不夠等殺死Service的情況),直到調用了 stopService() 方法。所以 startService() 的時候需要注意要在合適的時候調用 stopService() 以釋放內存。startService() 啓動的時候,Service 的生命週期函數調用順序是
onCreate() -> onStartCommand()
bindService() 啓動方式。
bindService()方法啓動的話,會通過 ServiceConnection 將 onBind() 返回的和 Service 通信的信道(IBinder)回調給調用方,調用方通過 IBinder 可以得到 Service,然後可以控制 Service。整個過程的生命週期函數調用如下:
onCreate()->onBind()->ServiceConnection 的方法回調
注: bindService() 方法需要的 onBind() 返回非空的 IBinder 。否則會綁定失敗。
3 Service 保活的常用方法
1 提高進程優先級,在清單文件
intent-filter
中設置android:priority
,沒試過,很多人說並不一定有效。2 通過
startForeground
方法,將 Service 轉變爲前臺進程。3 在 startCommand() 方法返回
START_STICKY
,這樣系統殺死 Service 後會從新傳 Intent ,從而有機會繼續處理。但是短時間連續被殺死後,系統不會回傳 Intent 。4 在 onDestory() 方法裏發送廣播喚醒自己。
5 接收騰訊、淘寶等發出的廣播 。
6 監聽系統廣播。
7 接入 小米push,華爲push 等。
8 守護進程,沒實際用過,據說5.0以後不好使,5.0 以後 jni 代碼 fork 出來的進程不能作爲守護進程。Android5.0 在應用退出後,ActivityManagerService不僅把主進程給殺死,另外把主進程所屬的進程組一併殺死,這樣一來,由於子進程和主進程在同一進程組,子進程在做的事情,也就停止了。但是有方法,點擊跳轉到大牛博客。
暫時寫到這裏,如有錯誤,請告知。