通過總結,記錄在android開發中,使用Service需要注意的點:
- Service兩種啟動方式和聲明周期
- IntentService使用
- Service更新UI方法
Service兩種啟動方式和聲明周期
Service聲明周期
第一種方式:通過StartService啟動Service
通過startService啟動后,service會一直無限期運行下去,只有外部調用了stopService()或stopSelf()方法時,該Service才會停止運行并銷毀。
- onCreate()
????onCreate()只會在第一次創建service時候調用,多次執行startService()不會重復調用onCreate(),此方法適合完成一些初始化工作。 - onStartCommand()
????如果多次執行了Context的startService()方法,那么Service的onStartCommand()方法也會相應的多次調用。onStartCommand()方法很重要,我們在該方法中根據傳入的Intent參數進行實際的操作,比如會在此處創建一個線程用于下載數據或播放音樂等。 - onDestory()
????在銷毀的時候會執行Service該方法。
以上幾個方法都是回調方法,且在主線程中執行,由android操作系統在合適的時機調用。
Service的onStartCommand()方法的返回值
- START_NOT_STICKY
????返回該值表示當Service運行的進程被Android系統強制殺掉之后,不會重新創建該Service。當然如果在其被殺掉之后一段時間又調用了startService,那么該Service又將被實例化。 - START_STICKY
????返回該值表示Service運行的進程被Android系統強制殺掉之后,Android系統會將該Service依然設置為started狀態(即運行狀態),但是不再保存onStartCommand方法傳入的intent對象,然后Android系統會嘗試再次重新創建該Service,并執行onStartCommand回調方法,但是onStartCommand回調方法的Intent參數為null,也就是onStartCommand方法雖然會執行但是獲取不到intent信息。 - START_REDELIVER_INTENT
????返回該值表示Service運行的進程被Android系統強制殺掉之后,與返回START_STICKY的情況類似,Android系統會將再次重新創建該Service,并執行onStartCommand回調方法,但是不同的是,Android系統會再次將Service在被殺掉之前最后一次傳入onStartCommand方法中的Intent再次保留下來并再次傳入到重新創建后的Service的onStartCommand方法中,這樣我們就能讀取到intent參數。 - START_STICKY_COMPATIBILITY
????START_STICKY的兼容版本,但不保證服務被終止后一定能重啟。
第二種方式:通過BindService啟動Service
bindService啟動服務的生命周期與其綁定的client息息相關。當client銷毀時,client會自動與Service解除綁定。當然,client也可以明確調用Context的unbindService()方法與Service解除綁定。當沒有任何client與Service綁定時,Service會自行銷毀。
public class TestService extends Service{
//client 可以通過Binder獲取Service實例
public class MyBinder extends Binder {
public TestService getService() {
return TestTwoService.this;
}
}
//通過binder實現調用者client與Service之間的通信
private MyBinder binder = new MyBinder();
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_NOT_STICKY;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return binder;
}
@Override
public boolean onUnbind(Intent intent) {
return false;
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
- onBind()
onBind方法返回的IBinder的實例需要返回Service實例本身。通常,最簡單的方法就是在service中創建binder的內部類,加入類似getService()的方法返回Service.
???? 第一次執行bindService時,onCreate和onBind方法會被調用,但是多次執行bindService時,onCreate和onBind方法并不會被多次調用,即并不會多次創建服務和綁定服務。
IntentService的使用
IntentService在它的onCreate()函數中通過實例化了一個HandlerThread開啟一個線程來處理所有Intent請求對象所對應的任務。IntentService在處理任務時,還是采用Handler+Message的方式,創建一個名叫ServiceHandler的Handler對象,并把它直接綁定到HandlerThread所對應的子線程。ServiceHandler把處理intent所對應的任務都封裝到onHandleIntent函數里。因此如果我們需要處理自己的任務,直接實現onHandleIntent方法,再在里面根據Intent的不同進行不同的處理就可以了。