Service的簡(jiǎn)介:
1:什么是service:
service是后臺(tái)服務(wù)
2:service的作用:
為了保證應(yīng)用程序被掛到后臺(tái)后某些組件仍然可以工作
3:service的弊端:
service既不是獨(dú)立的進(jìn)程也不是獨(dú)立的線程,是依賴于主線程的,所以是不建議在service里面做過多的耗時(shí)操作的,避免ANR。
IntentService的簡(jiǎn)介:
1.什么是intentService:
intentService是Service的子類,繼承service,擁有service的全部生命周期,包含了service的全部特性;
2.intentService的作用:
在onCreat被執(zhí)行時(shí)內(nèi)部會(huì)開啟一個(gè)線程,用于解決在后臺(tái)服務(wù)中進(jìn)行耗時(shí)操作;
例如:后臺(tái)上傳圖片,批量操作數(shù)據(jù)庫等;
IntentService使用方法:
源碼解讀
packagecom.shaomin.wsm.intentservice
importandroid.app.Service;
importandroid.content.Intent;
importandroid.os.Handler;
importandroid.os.HandlerThread;
importandroid.os.IBinder;
importandroid.os.Looper;
importandroid.os.Message;
publicabstractclassIntentServiceextendsService{
privatevolatileLoopermServiceLooper;//消息隊(duì)列
privatevolatileServiceHandlermServiceHandler;
privateStringmName;
privatebooleanmRedelivery;
//構(gòu)造方法 傳入我們創(chuàng)建的Intentservice的名字
publicIntentService(Stringname){
super();
mName=name;
}
//創(chuàng)建一個(gè)服務(wù)并開啟線程得到消息隊(duì)列并通過handller發(fā)送
@Override
publicvoidonCreate(){
super.onCreate();
//創(chuàng)建一個(gè)線程對(duì)象
HandlerThreadthread=newHandlerThread("IntentService["+mName+"]");
//開啟線程
thread.start();
//創(chuàng)建隊(duì)列,獲得Looper對(duì)象
mServiceLooper=thread.getLooper();
//創(chuàng)建線程對(duì)象
mServiceHandler=newServiceHandler(mServiceLooper);
}
//由onStartCommand中回調(diào)onstart通過mServiceHandler發(fā)送消息到該handler的handleMessage中去。
//最后handleMessage中回調(diào)onHandleIntent(intent)。
@Override
publicvoidonStart(Intentintent,intstartId){
//獲得消息對(duì)象
Messagemsg=mServiceHandler.obtainMessage();
msg.arg1=startId;
msg.obj=intent;
//發(fā)送消息
mServiceHandler.sendMessage(msg);
}
//設(shè)置該方法的布爾值(具體用途在onStartCommand中體現(xiàn))
publicvoidsetIntentRedelivery(booleanenabled){
mRedelivery=enabled;
}
//mRedelivery會(huì)根據(jù)setIntentRedelivery設(shè)置的布爾值返回START_REDELIVER_INTENT or START_NOT_STICKY
//START_NOT_STICKY型服務(wù)會(huì)直接被關(guān)閉
//START_REDELIVER_INTENT 型服務(wù)會(huì)在可用資源不再吃緊的時(shí)候嘗試再次啟動(dòng)服務(wù)
//當(dāng)我們的操作不是十分重要的時(shí)候,我們可以選擇START_NOT_STICKY,這也是IntentService的默認(rèn)選項(xiàng)
//當(dāng)我們認(rèn)為操作十分重要時(shí),則應(yīng)該選擇START_REDELIVER_INTENT 型服務(wù)
@Override
publicintonStartCommand(Intentintent,intflags,intstartId){
onStart(intent,startId);
returnmRedelivery?START_REDELIVER_INTENT:START_NOT_STICKY;
}
@Override
publicIBinderonBind(Intentintent){
returnnull;
}
//退出消息隊(duì)列
@Override
publicvoidonDestroy(){
mServiceLooper.quit();
}
privatefinalclassServiceHandlerextendsHandler{
publicServiceHandler(Looperlooper){
super(looper);
}
//接收handler發(fā)送的消息 消息值為int型相當(dāng)于一個(gè)請(qǐng)求的唯一標(biāo)識(shí)。每發(fā)送一個(gè)請(qǐng)求,會(huì)生成一個(gè)唯一的標(biāo)識(shí),然后將請(qǐng)求放入隊(duì)列,當(dāng)全部執(zhí)行完成(最后一個(gè)請(qǐng)求也就相當(dāng)于getLastStartId == startId),
// 或者當(dāng)前發(fā)送的標(biāo)識(shí)是最近發(fā)出的那一個(gè)(getLastStartId == startId),則會(huì)銷毀我們的Service.
@Override
publicvoidhandleMessage(Messagemsg){
onHandleIntent((Intent)msg.obj);
/**
* Message 可以傳遞的參數(shù)有:
1. arg1 arg2 整數(shù)類型,是setData的低成本替代品。傳遞簡(jiǎn)單類型
2. Object 類型 obj
3. what 用戶自定義的消息代碼,這樣接受者可以了解這個(gè)消息的信息。每個(gè)handler各自包含自己的消息代碼,所以不用擔(dān)心自定義的消息跟其他handlers有沖突。
*/
stopSelf(msg.arg1);
}
}
//重寫耗時(shí)操作的邏輯,改方法會(huì)延伸到繼承它的子類中實(shí)現(xiàn)
protectedabstractvoidonHandleIntent(Intentintent);
}
IntentService具體方法解讀
構(gòu)造函數(shù)
IntentService(String name)創(chuàng)建一個(gè) IntentService.
公用方法
onBind(Intent intent)不需要實(shí)現(xiàn)此方法,因?yàn)槟J(rèn)實(shí)現(xiàn)返回null
onCreate()當(dāng)服務(wù)首次創(chuàng)建時(shí)由系統(tǒng)調(diào)用。
onDestroy()通知服務(wù)不再使用并正在被刪除
onStartCommand不需要重寫
setIntentRedelivery(boolean enabled) 源碼中的體現(xiàn)是根據(jù)此方法設(shè)置的布爾值來決定onStartCommand 返回START_NOT_STICKY還是START_REDELIVER_INTENT;;;START_NOT_STICKY型服務(wù)會(huì)直接被關(guān)閉,而START_REDELIVER_INTENT 型服務(wù)會(huì)在可用資源不再吃緊的時(shí)候嘗試再次啟動(dòng)服務(wù)。 由此我們可以發(fā)現(xiàn),當(dāng)我們的操作不是十分重要的時(shí)候,我們可以選擇START_NOT_STICKY,這也是IntentService的默認(rèn)選項(xiàng),當(dāng)我們認(rèn)為操作十分重要時(shí),則應(yīng)該選擇START_REDELIVER_INTENT 型服務(wù)
onHandleIntent(Intent intent)該函數(shù)用于針對(duì)Intent的不同進(jìn)行不同的事務(wù)處理就可以了.執(zhí)行完所一個(gè)Intent請(qǐng)求對(duì)象所對(duì)應(yīng)的工作之后,如果沒有新的Intent請(qǐng)求達(dá)到,則自動(dòng)停止Service;否則ServiceHandler會(huì)取得下一個(gè)Intent請(qǐng)求傳人該函數(shù)來處理其所對(duì)應(yīng)的任務(wù)。