Android Service 小結

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不僅把主進程給殺死,另外把主進程所屬的進程組一併殺死,這樣一來,由於子進程和主進程在同一進程組,子進程在做的事情,也就停止了。但是有方法,點擊跳轉到大牛博客

暫時寫到這裏,如有錯誤,請告知。

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