前言
今天我们分析一下android中的IntentService
简单说下service与IntentService的区别
Service 不建议做耗时操作,如果必须做耗时操作需要手动在内部创建子线程去执行耗时操作
Service 通过startService启动后便会随程序一直存在!
IntentService 继承自Service,内部操作自动运行在子线程,执行完代码后会自动销毁
IntentService的使用
- 我们一般使用IntentService都是继承IntentService
- 然后重写其onHandleIntent方法,并在onHandleIntent方法中做逻辑操作
- onHandleIntent,主要操作也是方法这个方法内部进行的,此方法运行在子线程中,所以可以做耗时操作!
IntentService源码解读
我们按流程一步步的来看哈
- IntentService构造方法
/**
* 创建一个intentservice。由子类构造函数调用。
*
* @param 用于命名工作线程的名称,仅用于调试。
*/
public IntentService(String name) {
super();
mName = name;
}
IntentService只有个有参构造方法,而且有个参数name,看方法说明就可以明白了,这个name是为内部的工作线程命名使用的
- 因为IntentService也服务嘛,所以服务启动的时候肯定先执行onCreate方法
- IntentService onCreate()方法
@Override
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
可以看到在onCreate方法中创建了一个HandlerThread,HandlerThread是什么?
不知道HandlerThread的可以去看我的之前的文章
http://www.jianshu.com/p/ca7faafc035d HandlerThread的使用以及其原理解析
我们可以看到创建了一个HandlerThread,并将刚才的name传入了进去,就是这个线程的名称,然后启动了HandlerThread线程!
mServiceLooper = thread.getLooper();
获取了工作线程的Looper对象,也就是HandlerThread内部的Looper对象
mServiceHandler = new ServiceHandler(mServiceLooper);
创建了ServiceHandler,并传入了Looper对象
这个ServiceHandler就是继承自Handler的子类,跟一般Handler没什么区别
由于在创建ServiceHandler的时候指定了Looper对象,所以当前ServiceHandler便会运行在工作线程中了,
我们看下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);
}
}
我们主要看handleMessage这个方法都做了些什么?
onHandleIntent((Intent)msg.obj);
首先调用了onHandleIntent方法,也就是我们继承IntentService需要实现的一个抽象方法
protected abstract void onHandleIntent(@Nullable Intent intent);
就是这个抽象方法,我们继承IntentService的时候需要重写的方法,我们的耗时操作和代码也是写在这个方法里面的
在onHandleIntent方法后面又调用了stopSelf(msg.arg1);
stopSelf(msg.arg1);
stopSelf也就是停止自身的意思,所以在onHandleIntent执行完毕之后会自动停止服务
那么问题来了这个ServiceHandler是在什么时候开始发送消息开始执行的呢?
接着看:
onCreate方法之后该是onStartCommand方法了
- onStartCommand
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
在onStartCommand方法中调用了onStart方法
- onStart方法
@Override
public void onStart(@Nullable Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
是不是瞬间明白了?
在onStart方法中使用ServiceHandler对象发送了一个消息,消息保存了startId和Intent对象
这个startId是不是刚才stopSelf方法的参数嘛
stopSelf(msg.arg1);
到这里就通了吧!
来我们捋一捋!
onCreate方法执行的时候:
* 创建并启动了HandlerThread工作线程
* 创建了运行在工作线程的Handler,也就是ServiceHandler
onStartCommand方法执行的时候:
* 调用了onStart方法
onStart方法执行的时候:
* 使用ServiceHandler发送了一个消息,带上了startId与intent
ServiceHandler 的handleMessage执行的时候:
ServiceHandler的handleMessage接受到消息,执行onHandleIntent方法,将intent当做参数传入
执行完onHandleIntent方法,接着调用stopSelf传入startId来停止自身服务!
OK,捋清楚了!
所以IntentService的特点是,内部操作执行在子线程,执行所以代码自动销毁服务!
IntentService适合执行一段耗时操作,执行完毕自动销毁不用一直存在的场景,