那你讲一下IntentService

1,840 阅读2分钟

之前面BAT时被问过两三次的问题,为什么喜欢问这个?因为这里能延伸出去很多问题,想答好并不简单。

首先会问

IntentService跟Service有什么区别?

Service运行在主线程中,直接使用做耗时任务会卡主线程,从而导致ANR。Service ANR的时间为前台Service20秒,后台Service200秒。

而IntentService会开启子线程,重写onHandleIntent方法中处理逻辑即可,不会引发ANR。

如果高级岗位只回答到这里,那么结果大概率是

image.png

接着应该要回答

IntentService实现原理是什么?

IntentService整个类不到一百行代码,那就先把核心源码抬上来看看

image.png

image.png

核心原理就是用了HandlerThread+Handler,handler绑定的是HandlerThread的子线程looper mServiceLooper,onStart时sendMessage调用onHandleIntent执行重写的逻辑。

那么这时候肯定需要回答一下

HandlerThread是什么,怎么实现的?

image.png

image.png HandlerThread顾名思义就是Handler和Thread,其内部也是这样的,HandlerThread 继承Thread, run方法中prepare子线程的looper,存在mLooper中,方便外面获取。

所以HandlerThread比较适合用来做串行任务。

上图中我用箭头标注的地方是用了synchronize进行同步了,就延伸出一个问题,如果这个答上来,就可以判断出是看过这块的源码

HandlerThread中的synchronized作用是什么?

先看第二个箭头,getLooper方法会被外界所调用来获取当前线程的looper(可以看回IntentService的onCreate里面),然后进入同步代码块,如果mLooper为空会wait()阻塞等待,目的是等待mLooper赋值,mLooper的赋值是在第一个箭头那里,赋值之后notifyAll唤醒,然后返回已赋值的mLooper。

如果答上来这里,又可以继续问synchronized与lock的区别?实现原理?又或者问synchronized有几种锁类型?膨胀过程了解吗?可以发散开很多问题,单纯synchronized的内容就可以单独开一篇讲了。

温馨提示

IntentService新版本SDK被标记废弃,新版本让考虑使用workmanager或者JobIntentService,但,不妨碍学习里面的知识点。

总结一下

IntentService(Service+HandlerThread+Handler)

HandlerThread(extends Thread+handler+prepare looper)

构建自己的知识体系很重要,《那你讲一下》系列就是希望把这一些知识点尽量的串起来,能更好的帮助理解和关联记忆,而不是单纯分享某一个零散的知识点,其实就是我自己平时的笔记整理,希望大家可以喜欢这个系列,可以多多点赞吧。