Service 是Android四大組件之一,可以在不顯示介面的情況下在後台運行。還有一個作用是通過AIDL來實現處理序間通訊。
Service的啟動方式
Service的啟動方式有兩種,startService()與bindService()
startService():onCreate->onStartCommand(舊版本為onStart),結束通過stopService(),回調onDestroy
如果調用startService()方法前服務已經被建立,多次調用startService()方法並不會導致多次建立服務,但會導致多次調用onStartCommand()方法
bindService():onCreate->onBind,結束通過unBindService(),回調onUnbind->onDestroy.
第一種方式啟動Service,Service與調用者沒有關聯,調用者,比如Activity,finish掉後,Service還在運行。而bind就是兩者綁定到一起,調用者結束了,Service也會結束。當然,調用者也可以通過unbindService()直接解除綁定。
Service與Thread
很多人搞不懂Service和Thread的區別,這裡我談談我的理解。Service大家可以理解成沒有介面的Activity,他運行在主線程(UI線程)中,而不是另起一個線程,所以說為什麼不能在onStart(),onCreate()裡進行耗時的操作,因為會阻塞主線程,甚至會引起ANR異常。通常在Service裡進行耗時操作時都需要在Service中另起一個線程。同時,Service又分為local Service 和 remote Service ,分別為本地服務和遠程服務。
本地服務:在當前進程的主線程中,即與Client在同一進程,同時他是在運行UI線程上
遠程服務:另起一個進程,注意,是進程,不是線程。運行在該進程的主線程上。常用於處理序間通訊。
可以通過添加android:process="remote"代碼將Service設定成remote Service(預設是local)
至於Thread就不用介紹了,所以大家可以看出來Service從某個層面上說,與Thread半毛錢關係沒有。
那麼為什麼要引進local Service呢,為什麼不直接使用Thread呢?我的理解是local Service能夠更加方便地對Thread進行管理和維護,比如如果你在當前Activity start一個子線程,當你離開這個Activity時,你將失去這個子線程的引用。而無論你Activity如何跳轉,Service都可以安然地對子線程進行維護。
Service通訊
Service 通過IBinder進行通訊,首先建立內部類MyBinder繼承實現IBinder介面的Binder類。重寫onBind()方法返回MyBinder執行個體。
MyService MyBinder binder = MyBinder System.out.println("onbind" "Create" (!1000++ "unbind" .quit = "destroy"
在調用Service的Activity中建立ServiceConnection執行個體,重寫onServiceConnected,擷取IBinder對象
ServiceConnection conn = System.out.println("discouted" binder =
調用bindService(Intent service, ServiceConnection conn, int flags)時傳入第二個參數就是ServiceConnection執行個體。獲得IBinder對象後就可以調用裡面的方法。