真的是好久沒有寫博客了,突然覺得自己有時候很容易放棄很多東西,好了,現在重新開始自己的博客之旅。
廢話不多說了,首先是,之前也寫過一個比較簡單的Service解析的文章Android Service初解,但是當時對這個東西理解不是很深入,所以很多東西都是寫的很簡單的,最近開始看Android的開發文檔,然後覺得對Service有了一些更深入的認識,現在寫下來,避免以後忘記。
首先什麼是Service,我們爲什麼要使用Service而不是別的組件?
在Android的四大基本組件(Actvitiy,Service,ContentProvider,BroadcastReceiver)中,Service能夠爲我們提供長時間的後臺服務,並且可以實現進程間通信(IPC)
Service中涉及到的方法主要有以下幾種:
1)onCreate():服務開始創建時,系統自動調用
2)onStartCommand():每次調用startService()時,系統自動調用
3)onBind():第一次調用bindService()時,系統調用。之後無論bindService()運行多少次,只要服務尚未被銷燬,那麼系統均會自動將第一次調取onBind()的返回值返回,避免重複調用
4)onDestory():服務銷燬時調用
Service的啓動方式有以下兩種:
1)startService():
以startService()啓動的服務,不依賴於應用而存在,當應用關閉後,服務仍然生存,故我們需要調用stopSelf()或者stopService()來結束服務。
2)bindService():
以bindService()啓動的服務,在所有綁定他的組件unbindService()之後,就會自動銷燬服務,而我們也無法使用stopSelf()或者stopService()來銷燬這個服務。
在組件中調用bindService()後,會在onBind()方法中返回一個IBinder對象,這個對象通常會將Service類對象包含起來,用於在組件類中實現交互操作,故bindService()一般用於情況較複雜的時候,然後根據自身需求直接調用Service之中的方法。
常用的Service類:
有android.app.Service和android.app.IntentService。IntentService繼承自Service,這兩者的主要區別在於IntentService中的這些代碼:
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
}
@Override
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
@Override
public void onStart(Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
故每次啓動IntentService,都會新建一個線程,並在新線程中調用onHandleIntent(),之後會自動結束Service。因此,每次調用IntentService()都會經歷onCreate(),onStartCommand(),onDestory()的生命週期。而針對IntentService所調取的stopService()對他是沒有無效的。
並且IntentService中,對於onBind()模塊只是返回一個null值,並未做出其他處理,故一般僅有startService()中會使用到他,在bindService()中我們還是使用的Service。
最後,Service在默認情況下是運行於系統主線程中,所以當你在Service中運行耗時較久的服務,例如播放音樂或者網絡連接服務時,最好新建線程處理,以避免出現ui堵塞的情況