Service是android中四大組件之一,用于處理后臺(tái)任務(wù)柱搜,不能處理耗時(shí)任務(wù)迟郎,否則會(huì)造成ANR
而IntentService繼承自Service,但是可以處理耗時(shí)任務(wù)聪蘸,因?yàn)樵趦?nèi)部開(kāi)啟了一個(gè)子線程宪肖。
Service生命周期
Service的生命周期分為兩種情形,一種是通過(guò)startService啟動(dòng)健爬,另一種是通過(guò)bindService啟動(dòng)匈庭。
在這兩種情況下時(shí),Service的生命周期是有差異的浑劳。
startService
通過(guò)startService去啟動(dòng)一個(gè)Service阱持,
如果該Service未被創(chuàng)建,則會(huì)走onCreate魔熏、onStartCommand衷咽、onStart生命周期
如果該Service已被創(chuàng)建,則不會(huì)執(zhí)行onCreate蒜绽,只會(huì)執(zhí)行onStartCommand镶骗、onStart
onStart為正常運(yùn)行時(shí)的生命周期
而且startService可以被多次調(diào)用
被重復(fù)調(diào)用后會(huì)執(zhí)行下面的生命周期
通過(guò)startService啟動(dòng)的Service存活不依賴(lài)與Activity,即使啟動(dòng)該Service的Activity已經(jīng)被銷(xiāo)毀躲雅,但該Service仍然可以存活鼎姊。
通過(guò)startService啟動(dòng)的Service需要調(diào)用stopService來(lái)銷(xiāo)毀該Service,此時(shí)會(huì)執(zhí)行onDestroy周期函數(shù)
bindService
bindService時(shí),Service是依賴(lài)Activity的相赁,當(dāng)當(dāng)前Activity被銷(xiāo)毀相寇、或者調(diào)用unBindService時(shí),Service都會(huì)被銷(xiāo)毀钮科。
所以每一次調(diào)用bindService時(shí)唤衫,Service都會(huì)被重新創(chuàng)建
所以通過(guò)bindService去啟動(dòng)一個(gè)Service,
會(huì)走onCreate绵脯、onBind生命周期
class ServiceConnect() : ServiceConnection {
override fun onServiceDisconnected(name: ComponentName?) {
Log.d(TAG, "onServiceDisconnected: ")
}
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
Log.d(TAG, "onServiceConnected: ")
}
}
btn_bindService.setOnClickListener {
var conn = ServiceConnect()
bindService(Intent(this, MyService::class.java), conn, Context.BIND_AUTO_CREATE)
hasBind = true
}
當(dāng)執(zhí)行到onBind時(shí)佳励,還會(huì)執(zhí)行onServiceConnected
在Service中休里,不能執(zhí)行耗時(shí)操作,超過(guò)5秒赃承,則會(huì)造成程序不響應(yīng)ANR
當(dāng)我們需要執(zhí)行耗時(shí)操作時(shí)妙黍,則必須開(kāi)啟子線程,或者使用IntentService
IntentService
IntentService有與Service一樣的生命周期瞧剖,
只是在內(nèi)部開(kāi)啟了一個(gè)子線程废境,暴露onHandleIntent來(lái)執(zhí)行耗時(shí)任務(wù),
當(dāng)子線程執(zhí)行完就會(huì)終止當(dāng)前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(@Nullable Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
Servicehandler是IntentService的一個(gè)內(nèi)部類(lèi)筒繁,當(dāng)收到消息時(shí)調(diào)用onHandleIntent,當(dāng)執(zhí)行完噩凹,則調(diào)用stopSelf,終止當(dāng)前服務(wù)
在OnCreate中毡咏,新建了一個(gè)HandleThread驮宴,并運(yùn)行。
創(chuàng)建一個(gè)Servicehandler呕缭,而該ServiceHandler的Looper對(duì)象為HandleThread線程中創(chuàng)建的堵泽,
當(dāng)執(zhí)行到onStart生命周期時(shí),
handler發(fā)送一條消息恢总,此時(shí)就會(huì)走到ServiceHandler中的handlerMessage中迎罗,也就會(huì)執(zhí)行onHandleIntent中。
因?yàn)閙ServiceLooper = thread.getLooper();
所以onHandleIntent是運(yùn)行在HandlerThread中的片仿。