Service和IntentService的區(qū)別

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ù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 多線程的應(yīng)用 繼承Thread類 實(shí)現(xiàn)Runnable接口 AsyncTask Handler HandlerTh...
    Mr_不靠譜_先森閱讀 733評(píng)論 0 1
  • 前言:本文所寫的是博主的個(gè)人見解,如有錯(cuò)誤或者不恰當(dāng)之處,歡迎私信博主,加以改正!原文鏈接,demo鏈接 Serv...
    PassersHowe閱讀 1,510評(píng)論 0 5
  • 本篇文章是繼續(xù)上篇android圖片壓縮上傳系列-基礎(chǔ)篇文章的續(xù)篇。主要目的是:通過Service來執(zhí)行圖片壓縮任...
    laogui閱讀 4,505評(píng)論 5 62
  • [文章內(nèi)容來自Developers] Service是一個(gè)可以在后臺(tái)執(zhí)行長(zhǎng)時(shí)間運(yùn)行操作而不提供用戶界面的應(yīng)用組件。...
    岳小川閱讀 938評(píng)論 0 7
  • 按照家里的說法,陰歷生日已到,我終于18歲了??傁胫鴮懶┦裁?,或多或少的寫下曾經(jīng)零零散散的感覺。題目換了又換,決定...
    愛唱歌的神兒閱讀 296評(píng)論 0 1

友情鏈接更多精彩內(nèi)容