什么是IntentService
IntentService是一个特殊的service,内部有一个HandlerThread、ServiceHandler。通过使用startService(intent)可以是该IntentService执行执行的任务。因为IntentService是一种service,比单独的线程优先级更高,不容易被系统杀死。
IntentService是一个抽象类,使用它必须实现它。它有一个抽象方法onHandlerIntent(Intent),用于根据intent中的参数执行相应的任务。
IntentService的使用
首先实现IntentService,在onHandlerIntent中进行后台计算。
image.png
然后创建Intent,在Intent中方法指令,启动IntentService。
Intent service =new Intent(MainActivity.this,LocalIntentService.class);
Intent.putExtra("task_action","com.tinymonster.action.TASK1");
startService(service);
下面看一下IntentService中的几个关键组件
HandlerThread
HandlerThread继承了Thread,并且在内部自动创建了Looper。我们创建HandlerThread后,使用其内部的Looper创建一个Handler,就可以使用Handler在HandlerThread内部执行后台任务。用法如下
image.png
IntentService的内部原理
IntentService的onCreate方法中会创建一个HandlerThread,然后会创建ServiceHandler。当调用startService(intent)的时候,OnStart(intent)方法会像HandlerThread发送消息,HandlerThread接收消息后调用onHandlerIntent(intent)处理消息。最后OnStart调用stopSelf()停止自身。
IntentService.onCreate
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService"); //创建一个ThreadHandler
thread.start();
mServiceLooper = thread.getLooper(); //获取ThreadHandler内部的Looper
mServiceHandler = new ServiceHandler(mServiceLooper); //创建ServiceHandler
}
IntentService.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);
}
}
public void onStart(Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg); //向ServiceHandler 发送消息
}
总结
image.png1.IntentService.onCreate方法创建HandlerThread,HandlerThread内部又会创建Looper。根据Looper创建一个ServiceHandler
2.使用startService(intent)启动IntentService。
3.IntentService的onStart方法将消息发送给ServiceHandler。等待完成任务后执行stopSelf。
4.ServiceHandler调用抽象方法onHandlerIntent处理消息。
网友评论