Android IntentService 源碼解析

IntentService 是一種特殊的 Service,它繼承了 Service 并且它是一個(gè)抽象類,因此必須創(chuàng)建它的子類才能使用 IntentService瘫俊。IntentService 可用于執(zhí)行后臺(tái)耗時(shí)的任務(wù)峦失,當(dāng)任務(wù)執(zhí)行結(jié)束后它會(huì)自動(dòng)停止,同時(shí)由于 IntentService 是服務(wù)的原因筒严,這導(dǎo)致它的優(yōu)先級比單純的線程要高很多丹泉,所以 IntentService 比較適合執(zhí)行一些高優(yōu)先級的后臺(tái)任務(wù),因?yàn)樗鼉?yōu)先級高不容易被系統(tǒng)殺死鸭蛙。

一摹恨、源碼剖析
1. IntentService 是 Service 的子類,所以 IntentService 也是一個(gè)服務(wù)
public abstract class IntentService extends Service {
    ······
}
2. IntentService 內(nèi)部會(huì)創(chuàng)建 HandlerThread 和 Handler 實(shí)例娶视,并將 HandlerThread 內(nèi)的 Looper 作為 Handler 的 Looper晒哄,服務(wù)銷毀時(shí)退出 Looper
@Override
public void onCreate() {
    super.onCreate();
    HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
    thread.start();
 
    mServiceLooper = thread.getLooper();
    mServiceHandler = new ServiceHandler(mServiceLooper);
}

@Override
public void onDestroy() {
    mServiceLooper.quit();
}
3. 外部發(fā)送的事件會(huì)被依次傳遞到 Handler 中
@Override
public void onStart(@Nullable Intent intent, int startId) {
    Message msg = mServiceHandler.obtainMessage();
    msg.arg1 = startId;
    msg.obj = intent;
    mServiceHandler.sendMessage(msg);
}
 
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
    onStart(intent, startId);
    return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
4. 在 Handler 內(nèi)會(huì)調(diào)用 onHandleIntent 方法
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);
    }
}

當(dāng) onHandleIntent 方法執(zhí)行結(jié)束后,IntentService 會(huì)通過 stopSelf(int startId) 方法來嘗試停止服務(wù)肪获。這里之所以采用 stopSelf(int startId) 而不是 stopSelf() 來停止服務(wù)寝凌,那是因?yàn)?stopSelf() 會(huì)立刻停止服務(wù),而這個(gè)時(shí)候可能還有其他消息未處理孝赫,stopSelf(int startId) 則會(huì)等待所有的消息都處理完畢后才終止服務(wù)较木。一般來說,stopSelf(int startId) 在嘗試停止服務(wù)之前會(huì)判斷最近啟動(dòng)服務(wù)的次數(shù)是否和 startId 相等青柄,如果相等就立刻停止服務(wù)伐债,不相等則不停止服務(wù)预侯,這個(gè)策略可以從 AMS 的 stopServiceToken 方法的實(shí)現(xiàn)中找到依據(jù)。

二泳赋、使用案例
1. 繼承 IntentService
public class LocalIntentService extends IntentService {

    private static final String TAG = "LocalIntentService";

    public LocalIntentService() {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        String action = intent.getStringExtra("task_action");
        Log.d(TAG, "handle task: " + action);
        SystemClock.sleep(2000);
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "service destroyed");
        super.onDestroy();
    }
}
2. 調(diào)用
Intent service = new Intent(this, LocalIntentService.class);
service.putExtra("task_action", "TASK1");
startService(service);
service.putExtra("task_action","TASK2"); 
startService(service);

Log 日志:

2020-12-08 13:18:43.606 D/LocalIntentService: handle task: TASK1
2020-12-08 13:18:45.606 D/LocalIntentService: handle task: TASK2
2020-12-08 13:18:47.608 D/LocalIntentService: service destroyed
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雌桑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子祖今,更是在濱河造成了極大的恐慌校坑,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件千诬,死亡現(xiàn)場離奇詭異耍目,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)徐绑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門邪驮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人傲茄,你說我怎么就攤上這事毅访。” “怎么了盘榨?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵喻粹,是天一觀的道長。 經(jīng)常有香客問我草巡,道長守呜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任山憨,我火速辦了婚禮查乒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘郁竟。我一直安慰自己玛迄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布棚亩。 她就那樣靜靜地躺著憔晒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蔑舞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天嘹屯,我揣著相機(jī)與錄音攻询,去河邊找鬼。 笑死州弟,一個(gè)胖子當(dāng)著我的面吹牛钧栖,可吹牛的內(nèi)容都是我干的低零。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拯杠,長吁一口氣:“原來是場噩夢啊……” “哼掏婶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起潭陪,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雄妥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后依溯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體老厌,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年黎炉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枝秤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慷嗜,死狀恐怖淀弹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庆械,我是刑警寧澤薇溃,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站干奢,受9級特大地震影響痊焊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜忿峻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一薄啥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逛尚,春花似錦垄惧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至滤钱,卻和暖如春觉壶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背件缸。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工铜靶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人他炊。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓争剿,卻偏偏與公主長得像已艰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蚕苇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 題外話:我為什么特意寫呢哩掺,是因?yàn)槲襉PPO面試時(shí)候問到了我intentservice有了解么,我當(dāng)時(shí)回答了有初步了...
    陸陸陸陸_9d5f閱讀 305評論 0 0
  • 每天一篇系列:強(qiáng)化知識(shí)體系涩笤,查漏補(bǔ)缺嚼吞。歡迎指正,共同學(xué)習(xí)辆它! IntentService是一個(gè)Android基礎(chǔ)類誊薄,...
    Young_Allen閱讀 111評論 0 1
  • 序言 最近有用到IntentService,對IntentService的源碼做了一定的學(xué)習(xí)锰茉,所以今天來談?wù)勎覍...
    瘦竹竿閱讀 504評論 2 6
  • IntentService 在實(shí)際開發(fā)過程中會(huì)有這樣的一個(gè)需求呢蔫,我們需要運(yùn)行一個(gè)任務(wù),并且只需要在后臺(tái)默默運(yùn)行即可...
    未見哥哥閱讀 373評論 0 3
  • 久違的晴天飒筑,家長會(huì)片吊。 家長大會(huì)開好到教室時(shí),離放學(xué)已經(jīng)沒多少時(shí)間了协屡。班主任說已經(jīng)安排了三個(gè)家長分享經(jīng)驗(yàn)俏脊。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,523評論 16 22