Android SDK源码解析篇之IntentService使用
总结完HandlerThread的原理以后,今天开始总结IntentService的使用和原理解析。
IntentService的特点
IntentService继承于Service,与Service不同的是,当我们每次开启IntentService后,我们不需要去手动的再调用stopSelf()去关闭这个IntentService,当业务执行完毕后它会自动地关闭这个Service。
使用
首先需要写一个类继承自IntentService,并在onHandleIntent()方法中去实现我们想要在这个Service中的业务.至于为什么会在这个方法里实现,下面会通过源码告诉答案。
public class MyIntentService extends IntentService {
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
LogUtils.e("MyIntentService" , "开始执行IntentService");
}
}
定义好类以后我们还需要在AndroidMainfest.xml application标签中声明一下这个Service
<service android:name=".MyIntentService"></service>
接着我们只需要在使用时调用
Intent intent = new Intent(this,MyIntentService.class);
startService(intent);
打印结果如下
02-27 15:12:48.988 3690-3733/com.txVideo.demo E/MyIntentService: 开始执行IntentService
使用过程还是比较简单的,那么我们接下来看看它的实现原理,首先我们打开IntentService类看看与Service有些什么不同的地方
打开源码,我就看到了两个变量
private volatile Looper mServiceLooper;
@UnsupportedAppUsage
private volatile ServiceHandler mServiceHandler;
通过前面总结的Handler和HandlerThread的知识,似乎猜到了一点东西,那么我们接着往下看,在复写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);
}
这很明显嘛,这不就是上篇文章HandlerThead的使用嘛,通过新开一个HandlerThread线程,开启Looper的循环,然后让mServiceHandler去处理接收到消息时的业务,那么我们再看一下这个mServiceHandler的对象:
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);
}
}
代码很简单,其实ServiceHandler就是一个Handler的子类,不过它在处理消息时,触发了onHandleIntent()方法,这不就是刚刚那个IntentService中的处理业务的onHandleIntent()方法吗?然后调用了stopSelf()方法,这个方法是Service中的,也就是停止Service所用的。那么IntentService如何触发了onHandleIntent()就知道了。但是HandlerThread是需要被触发的,所以我们看看它是如何被触发的.然后我就看到了onStart()方法。
@Override
public void onStart(@Nullable Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
这就是一个很简单的发送消息的过程嘛。
最后我们知道HandlerThread使用完毕以后需要关闭它的循环,当然,IntentService也做了
@Override
public void onDestroy() {
mServiceLooper.quit();
}
所以到这里,整个IntentService的运行原理我们就了解了,梳理一下:
- 首先我们创建IntentService的实例对象时,触发了onCreate()方法,它开启了一个HandlerThread,并且调用了start()方法,开启了Looper循环,接收消息,然后创建了一个Handler实例,这个实例会处理接收到的消息,每处理一次消息,会触发一次onHandleIntent()方法,然后关闭调用stopSelf()关闭这个服务.最后在onDestroy()方法中关闭这个Looper循环。
- 我们在onStart()方法里向这个Handler发送消息,用来触发Handler中的handlerMessage()方法。
梳理完整个原理,大家应该也就知道为什么onHandleIntent()方法是处理IntentService()业务的地方,为什么每次这个IntentService执行完业务都会自己关闭了.
今天的IntentService使用及源码解析就整理到这里啦,觉得有帮助记得点个赞~