在上一篇我们已经讲过HandlerThread的原理以及使用,今天我们来讲一下IntentService
IntentService简介
IntentService是一个抽象类,继承自Service,所以IntentService就是一个Service,只是InentService可以执行耗时操作,逐一处理异步任务,直到任务结束自动结束Service。
public abstract class IntentService extends Service {...}
IntentService源码解析
public abstract class IntentService extends Service {
private volatile Looper mServiceLooper;
private volatile ServiceHandler mServiceHandler;
private String mName;
private boolean mRedelivery;
/**
一个内部类Handler
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
//调用这个方法处理数据
onHandleIntent((Intent)msg.obj);
//处理完成结束Service
stopSelf(msg.arg1);
}
}
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
* @param name Used to name the worker thread, important only for debugging.
*/
public IntentService(String name) {
super();
mName = name;
}
public void setIntentRedelivery(boolean enabled) {
mRedelivery = enabled;
}
@Override
public void onCreate() {
super.onCreate();
//创建一个HandlerThread,
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
//启动HandlerThread
thread.start();
//获取HandlerThread的Looper对象
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
@Override
public void onStart(@Nullable Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
@Override
public void onDestroy() {
mServiceLooper.quit();
}
@Override
@Nullable
public IBinder onBind(Intent intent) {
return null;
}
@WorkerThread
protected abstract void onHandleIntent(@Nullable Intent intent);
}
1.启动IntentService调用onCreate方法,首先会启动一个HandlerThread线程,然后获取到HandlerThread的Looper对象,然后根据这个Looper对象实例化Handler。
2.在onStart方法里面用Handler发送消息,在onStartCommand方法调用onStart方法。
3.在handleMessage方法里面调用onHandleIntent((Intent)msg.obj)方法,所有继承IntentService的Service都会实现onHandleIntent((Intent)msg.obj)方法,在这个方法里面处理耗时事件
总结
在第一次启动 IntentService 后,IntentService 仍然可以接受新的请求,接受到的新的请求被放入了工作队列中,等待被串行执行。
用 IntentService 显著简化了启动服务的实现,如果您决定还重写其他回调方法(如 onCreate()、onStartCommand() 或 onDestroy()),请确保调用超类实现,
以便 IntentService 能够妥善处理工作线程的生命周期。
由于大多数启动服务都不必同时处理多个请求(实际上,这种多线程情况可能很危险),因此使用 IntentService 类实现服务也许是最好的选择。
拓展:如何在IntentService里面并行执行消息队列?
在onHandleIntent方法回调时采用线程池,当有消息来时将线程放入线程池执行。
网友评论