Android源码解析之Inten

1引言

本文我们将讲解IntentService相关的知识。什么是IntentService?简单来说IntentService就是一个自身含有消息循环的Service,首先它是一个service,所以service相关具有的特性他都有,同时他还有一些自身的属性,其内部封装了一个消息队列和一个HandlerThread,在其具体的抽象方法:onHandleIntent方法是运行在其消息队列线程中,废话不多说,我们来看其简单的使用方法:

2定义一个IntentService3在androidManifest.xml中定义service4启动这个service5源码分析

可以发现当点击title组件的时候,service接收到了消息并打印出了传递过去的intent参数,同时显示onHandlerIntent方法执行的线程ID并非主线程,这是为什么呢?

下面我们来看一下service的源码:

怎么样,代码还是相当的简洁的,首先通过定义我们可以知道IntentService是一个Service,并且是一个抽象类,所以我们在继承IntentService的时候需要实现其抽象方法:onHandlerIntent。

下面看一下其onCreate方法:

我们可以发现其内部定义一个HandlerIThread(本质上是一个含有消息队列的线程)具体可参考:android源码解析之(四)–HandlerThread

然后用成员变量维护其Looper和Handler,由于其Handler关联着这个HandlerThread的Looper对象,所以Handler的handMessage方法在HandlerThread线程中执行。

然后我们发现其onStartCommand方法就是调用的其onStart方法,具体看一下其onStart方法:

很简单就是就是讲startId和启动时接受到的intent对象传递到消息队列中处理,那么我们具体看一下其消息队列的处理逻辑:

可以看到起handleMessage方法内部执行了两个逻辑一个是调用了其onHandlerIntent抽象方法,通过分析其onCreate方法handler对象的创建过程我们知道其handler对象是依附于HandlerThread线程的,所以其handeMessage方法也是在HandlerThread线程中执行的,从而证实了我们刚刚例子中的一个结论。onHandlerIntent在子线程中执行。

然后调用了stopSelf方法,这里需要注意的是stopSelf方法传递了msg.arg1参数,从刚刚的onStart方法我们可以知道我们传递了startId,参考其他文章我们知道,由于service可以启动N次,可以传递N次消息,当IntentService的消息队列中含有消息时调用stopSelf(startId)并不会立即stop自己,只有当消息队列中最后一个消息被执行完成时才会真正的stop自身。

这样通过上面的解析过程我们大概的对IntentServie有了基本的了解,IntentService其本质上是一个含有消息队列的Service对象。

6总结

IntentService是一个service,也是一个抽象类;

继承IntentService需要实现其onHandlerIntent抽象方法;

onHandlerIntent在子线程中执行;

IntentService内部保存着一个HandlerThread、Looper与Handler等成员变量,维护这自身的消息队列;

每次IntentService后台任务执行完成之后都会尝试关闭自身,但是当且仅当IntentService消息队列中最后一个消息被执行完成之后才会真正的stop自身;

本文摘自稀土掘金

正文结束啦!看到这的小伙伴一定是铁粉!长按下方图片并识别







































北京白癜风医院好不好
昆明治疗白癜风



转载请注明:http://www.gslnbdf.com/azyx/1449.html