前言:本文主要討論啟動遠程Service。
Service和Activity不在一個工程里面,也即不在一個App里面。不在一個進程里,所以會用到AIDL。
Service的android:process屬性未指定。
一、startService
1、通過調用startService啟動服務的過程:
onCreate —》onStartCommand —》onStart
startService 僅用於啟動服務,如果Activity需要與Service進行通信,需利用Broadcast。
2、而后,多次調用startService,服務會多次執行:
onStartCommand —》onStart
3、多次調用startService后,調用一次stopService即可結束服務。(若多次調用stopService,只有第一次有用)
4、調用stopService的服務結束過程:
—》onDestroy
另外,
Activity的啟動過程:onCreate —》onStart —》onResume
Activity的退出過程:onPause —》onStop —》onDestroy
二、bindService
1、通過調用bindService啟動服務的過程:
onCreate —》onBind —》(onServiceConnected)
bindService 可用於啟動服務,且能使Activity與Service進行通信。
2、多次調用bindService,服務本身未執行任何操作。
3、所以一次unBindService就能結束服務。(若多次調用unBindService,第一次有用,后面會出錯)
4、調用unBindService的服務結束過程:
onUnbind —》onDestroy
三、先startService,后bindService
1、先調用startService,后調用bindService。服務的執行過程為:
onCreate —》onStartCommand —》onStart —》onBind —》(onServiceConnected)
2、先unBindService,后stopService。服務結束的執行過程:
onUnbind —》onDestroy
需注意的是:unBindService會執行到onUnbind,stopService會執行到onDestroy。
3、先stopService,后unBindService。服務結束的執行過程:
onUnbind —》onDestroy
需注意的是:stopService不會執行任何操作,unBindService會執行到onUnbind—》onDestroy。
四、先bindService,后startService
1、先調用startService,后調用bindService。服務的執行過程為:
onCreate —》onBind —》(onServiceConnected) —》onStartCommand —》onStart
2、先unBindService,后stopService。
服務執行的過程同 三。
3、先stopService,后unBindService。服務結束的執行過程:
服務執行的過程同 三。
五、總結
1、多次bindService時,服務本身的onBind不會被多次執行。
2、bind上一個Service后,執行一次unBindService就夠了。不然會出錯。
3、一個App里,同一個Activity多次bind一個服務,除了第一次,后面的bind不會有任何onBind、onServiceConnected打印。
一個App里,不同的Activity去bind一個服務,第一次bind有onBind、onServiceConnected打印,后面的bind只會有onServiceConnected打印。
4、一個Activity bind上一個Service后,如果Activity finish前沒有調用unBind,App會崩潰,Log打印如下:
android.app.ServiceConnectionLeaked: Activity com.example.testactivity1.MainActivity has leaked ServiceConnection
com.example.testactivity1.MainActivity$1@412d9808 that was originally bound here.