读IntentService、HandlerThread源码之浅析
2017-04-21 13:34
435 查看
通过阅读源码解决一下问题:
1、IntentService基于HandlerThread与Handler实现?
2、IntentService执行完任务之后,自己结束运行?
首先看第一个问题:IntentService基于HandlerThread实现?看源码:
IntentService的onCreate回调函数生成了一个HandlerThread线程(工作者线程)对象,紧接着调用了其start方法启动了该线程。同时获取Thread的Looper初始化ServiceHandler。到目前为止,所需的“材料”都准备好了,下面看看如何利用这些“材料”完成一次任务的处理。
一般我们启动一个IntentService都会写如下的代码:
这样我们就启动了一个IntentService了。按照Service的生命周期,接下来会执行start回调函数:
可以看到IntentService的处理方式是:发送消息给ServiceHandler,这样就将任务的执行切换到了工作线程。我们再看一下ServiceHandler是怎么处理的:
有没有很熟悉的感觉?这就是onHandleIntent执行的地方,当任务执行完毕后,IntentService会调用stopSelf(...)来结束运行,无需开发者做额外的工作。
以上分析已经验证了(1)(2)问题。
最后,简单的说一下HandlerThread,这个HandlerThread是一个比较特殊的线程,是一个具有Looper的Thread,可以让开发者非常容易的从UI线程切换到工作线程。看一下源码吧:
通过源码可以发现,HandlerThread的run方法在该线程中生成了一个Looper,而这个Looper在IntentService中初始化了IntentSerice的Handler。
附图一张:
1、IntentService基于HandlerThread与Handler实现?
2、IntentService执行完任务之后,自己结束运行?
首先看第一个问题:IntentService基于HandlerThread实现?看源码:
@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); }
IntentService的onCreate回调函数生成了一个HandlerThread线程(工作者线程)对象,紧接着调用了其start方法启动了该线程。同时获取Thread的Looper初始化ServiceHandler。到目前为止,所需的“材料”都准备好了,下面看看如何利用这些“材料”完成一次任务的处理。
一般我们启动一个IntentService都会写如下的代码:
startService(new Intent(IntentServiceActivity.this, XXXXX.class));
这样我们就启动了一个IntentService了。按照Service的生命周期,接下来会执行start回调函数:
@Override public void onStart(@Nullable Intent intent, int startId) { Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; msg.obj = intent; mServiceHandler.sendMessage(msg); }
可以看到IntentService的处理方式是:发送消息给ServiceHandler,这样就将任务的执行切换到了工作线程。我们再看一下ServiceHandler是怎么处理的:
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); } }
有没有很熟悉的感觉?这就是onHandleIntent执行的地方,当任务执行完毕后,IntentService会调用stopSelf(...)来结束运行,无需开发者做额外的工作。
以上分析已经验证了(1)(2)问题。
最后,简单的说一下HandlerThread,这个HandlerThread是一个比较特殊的线程,是一个具有Looper的Thread,可以让开发者非常容易的从UI线程切换到工作线程。看一下源码吧:
@Override public void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1; }
通过源码可以发现,HandlerThread的run方法在该线程中生成了一个Looper,而这个Looper在IntentService中初始化了IntentSerice的Handler。
附图一张:
相关文章推荐
- Handler与HandlerThread、IntentService源码解析
- android IntentService Service HandlerThread 源码解读
- Android HandlerThread和IntentService用法和源码解析
- Android中的HandlerThread和IntentService
- 面试体记录第六节——(handlerThread、intentservice、view)
- IntentService和HandlerThread
- Android之IntentService源码浅析
- Android异步相关-AsyncTask/HandlerThread/IntentService
- HandlerThread和IntentService
- HandlerThread与IntentService完全解析
- android 进程/线程管理(三)----Thread,Looper / HandlerThread / IntentService
- android 线程(AsyncTask,Threadhandler,intentService)详解
- Android IntentService浅谈以及源码分析
- 学徒浅析Android开发:第五讲——Handler和Intent的是传值流程
- android 源码分析后 看 Thread、Handler、Looper、Message的使用
- 【QEMU-KVM代码分析之三】IO thread源码浅析之main loop
- IntentService源码详解
- android_IntentService,AsyncTask,Handler
- Handler、Looper、MessageQueue、Thread源码分析
- android的消息处理机制(图+源码分析)——Thread,Looper,MessageQueue,Message,Handler之间的关系