1. 程式人生 > >Android總結系列:Service

Android總結系列:Service

1.Service是什麼?

Service通常稱為“後臺服務”,不依賴UI介面,通常適用於下面條件:1. 並不依賴於使用者可視介面(前臺Service與Notification結合使用除外)2.具有較長時間的執行特性。

Service啟動方式兩種:startService與bindService

Service在AndroidManifest.xml中宣告屬性介紹
android:export屬性宣告是否可以被外部程式啟動, android:name對應Service類名,android:permission是許可權宣告,android:process設定具體的程序名稱。在Manifest中沒有宣告不會崩潰,而是報waring資訊“IllegalArgumentException: Service not registered”。

2.兩種啟動方式介紹

startService相對簡單,通過context.startService(Intent serviceIntent)啟動Service,context.stopService(Intent serviceIntent)停止此Service。當然,在Service內部,也可以通過stopSelf(…)方式停止其本身。

生命週期為onCreate,onStartCommand, onDestory

onStartCommond的返回引數具有的含義:
START_NOT_STICKY:當Service因為記憶體不足而被系統kill後,接下來未來的某個時間內,即使系統記憶體足夠可用,系統也不會嘗試重新建立此Service。除非程式中Client明確再次呼叫startService(…)啟動此Service。

START_STICKY:當Service因為記憶體不足而被系統kill後,接下來未來的某個時間內,當系統記憶體足夠可用的情況下,系統將會嘗試重新建立此Service,一旦建立成功後將回調onStartCommand(…)方法,但其中的Intent將是null,pendingintent除外。

START_REDELIVER_INTENT:與START_STICKY唯一不同的是,回撥onStartCommand(…)方法時,其中的Intent將是非空,將是最後一次呼叫startService(…)中的intent。

注意:Service是被系統因為記憶體不足而被殺死,返回值針對此才有意義,如果是被強制kill掉的或者設定中強制停止,則無論返回何種值都沒有意義,服務都不會重啟。

通過start方式啟動,生命週期onCreate,onStartCommand, onDestory
通過bind方式啟動,宣告週期onCreate,onBind, onStartCommond, onUnBind, onDestory

3.bind Service通訊方式

程序內與程序間通訊方式
1. 繼承Binder類
extend Binder class
可以完成程序內的通訊,如Service與對於Activity的通訊
2. 通過Messager類
可以完成程序間的C-S架構通訊
3. 通過aidl完成跨程序通訊

4.本地服務與遠端服務

Local Service:不少人又稱之為”本地服務“,是指Client - Service同處於一個程序;
Remote Service:又稱之為”遠端服務“,一般是指Service處於單獨的一個程序中。

5.Service特性

  1. Service執行在主執行緒中,所以耗時操作需要起執行緒處理,避免UI執行緒阻塞導致的ANR
  2. Service一旦建立,需要顯示呼叫相關方法停止服務,Started Service需要呼叫stopService(..)或Service本身呼叫stopSelf(..), Bound Service需要呼叫unbindService(..)

6.IntentService

Intent有如下特點:
1.預設直接實現了onBind(..)方法,直接返回null,並定義了抽象方法onHandlerIntent(..),使用者自定義子類時,需要實現此方法;
2.onHandlerIntent(..)主要就是用來處於相應的”長期“任務的,並且已經自動在新的執行緒中,使用者無法自定義新執行緒;
3.當”長期“任務執行完畢後(也就是onHandlerIntent(..)執行完畢後),此IntentService將自動結束,無需人為呼叫方法使其結束;
4.IntentService處於任務時,也是按照佇列的方式一個個去處理,而非真正意義上的多執行緒併發方式。

7.前臺程序

通過Service.startForeground (int id, Notification notification)方法可以將此Service設定為前臺Service。在UI顯示上,notification將是一個處於onGoing狀態的通知,使得前臺Service擁有更高的程序優先順序,並且Service可以直接notification通訊。

Service詳細總結1戳這裡
Service詳細總結2戳這裡