源码探索系列8---IntentService

我们知道,我们的Service如果要执行一些耗时的操作,需要开单独的线程去干活,而IntentService却不用,
在他的onHandleIntent函数里面我们可以执行耗时操作,啊,到底神奇在哪里了呢?
让我们去看看他的源码,背后到底做了什么好事情!

起航 --- IntentService

API:23

public abstract class IntentService extends Service 

我们的IntentService是一个继承Service的抽象类,那关于他的启动,停止等就和Service一样,前一篇就解释过了,我们现在就不说了。整个类也就164行,不大,还不够AMS里面一个函数的一半长度,哈,我们从他的OnCreate函数开始吧

@Override
public void onCreate() {
    // TODO: It would be nice to have an option to hold a partial wakelock
    // during processing, and to have a static startService(Context, Intent)
    // method that would launch the service & hand off a wakelock.

    super.onCreate();
    HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
    thread.start();

    mServiceLooper = thread.getLooper();
    mServiceHandler = new ServiceHandler(mServiceLooper);
}

我们看到他开了一个子线程和Handler。这里我们可以猜测了,之所以在我们的onHandleIntent很可能是因为他们两个!
让我们继续看下去

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    onStart(intent, startId);
    return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}

@Override
public void onStart(Intent intent, int startId) {
    Message msg = mServiceHandler.obtainMessage();
    msg.arg1 = startId;
    msg.obj = intent;
    mServiceHandler.sendMessage(msg);
}

好了,我们看到了线索了,发送过来的消息,通过onStartCommand()跑到了onStart,他里面调用了Handler去发送一个包含我们的Intent的消息。让我们去看下这个消息背后被怎么处理

@Override
public void handleMessage(Message msg) {
    onHandleIntent((Intent)msg.obj);
    stopSelf(msg.arg1);
}

我们看到他就直接调用我们的onHandleIntent(),让我们去处理发送过来的Intent。
处理完后调用stopSelf(int id);,这个函数需要解释下,他和我们的stopSelf()是有区别的,前者是判断下看是否还有没处理的消息,有就继续干活,没有才结束,后者就不管啦,死就死的。

后记

这里有些需要补充的:

  1. 排队
    我们看到,这个IntentService是借助消息队列实现的,这种单线程,排队的任务队列,每次只执行一个,后面来的就需要等前面一个做完。
    这点可能有时不适合我们的实际需求情况,我们可能还想一次干多点,这时候还是我们自己在Service里面做吧!
    但他有些好的,就是他处理完就会去调用 stopSelf(msg.arg1);
  1. WakeLock
    不知道你有没注意到,在他的OnCreate函数他注视里面有个todo的内容

TODO: It would be nice to have an option to hold a partial wakelock
during processing, and to have a static startService(Context, Intent)
method that would launch the service & hand off a wakelock.

关于这个wakelock,可以补充点内容在这里,因为这篇突然好短,哈哈,都不习惯了,所以使劲加点内容
他的作用可以让屏幕保持唤醒,不过得先声明下权限

```
<uses-permission android:name="android.permission.WAKE_LOCK" />
```

曾经使用他的一个情景就是在做IM功能的时候,在做那个声音的功能的时候,需要用他来保持唤醒。

    wakeLock = ((PowerManager) getSystemService(Context.POWER_SERVICE)).
                newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "demo");

    wakeLock.acquire(); //设置保持唤醒
    
    ...
    
    wakeLock.release(); //解除保持唤醒

另外我们平时使用手机看电影的时候,也会遇到过,要保持屏幕常量嘛。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,976评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,249评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,449评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,433评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,460评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,132评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,721评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,641评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,180评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,267评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,408评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,076评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,767评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,255评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,386评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,764评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,413评论 2 358

推荐阅读更多精彩内容

  • 本篇文章是继续上篇android图片压缩上传系列-基础篇文章的续篇。主要目的是:通过Service来执行图片压缩任...
    laogui阅读 4,445评论 5 62
  • java 接口的意义-百度 规范、扩展、回调 抽象类的意义-乐视 为其子类提供一个公共的类型封装子类中得重复内容定...
    交流电1582阅读 2,240评论 0 11
  • 前言:本文所写的是博主的个人见解,如有错误或者不恰当之处,欢迎私信博主,加以改正!原文链接,demo链接 Serv...
    PassersHowe阅读 1,421评论 0 5
  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-androi...
    eddy_wiki阅读 3,273评论 0 20
  • 一个季节流转,变换一方不同的天空,改变一场不期而遇的温暖。是季节的气候变化,还是思情的增减?春逝了,繁花落尽,春水...
    明续阅读 216评论 0 1