安卓四大组价之一Service,普通的Service是运行在主线程中的,一旦我们做什么耗时操作则会出现ANR。android提供了IntentService给我们,它默认会开启一个带有Looper循环的线程执行我们的任务。当我们的任务结束时会尝试关闭我们的service,但是只有当消息队列没有任务时才会关闭成功。
它的底层是靠HandlerThrea实现的,上一篇文章中我们讲解了HandlerThread,其本质上是一个Thread,只不过内部定义了其自身的Looper和MessageQueue。通过Handler绑定looper可以实现线程间的通信
android开发:HandlerThread源码解析
IntentService使用:
public class MyIntentService extends IntentService {
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
1.继承IntentService
2.构造函数调用父类的构造函数
3.重写它的onHandleIntent方法
源码分析
构造方法:
77 */
78 public IntentService(String name) {
79 super();
80 mName = name;
81 }
IntentService的构造方法:调用父类的构造方法创建service,初始化mName(mName在创建HandlerThread时用到)
。
oncreate()方法:
102
103 @Override
104 public void onCreate() {
105 // TODO: It would be nice to have an option to hold a partial wakelock
106 // during processing, and to have a static startService(Context, Intent)
107 // method that would launch the service & hand off a wakelock.
108
109 super.onCreate();
//创建HandlerThread对象,mName 作为线程的名称
110 HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
//开启线程
111 thread.start();
112 //获取线程的HandlerThread的Looper对象
113 mServiceLooper = thread.getLooper();
//创建Handler对象,并绑定Looper对象
114 mServiceHandler = new ServiceHandler(mServiceLooper);
115 }
116
private final class ServiceHandler extends Handler {
62 public ServiceHandler(Looper looper) {
63 super(looper);
64 }
65
66 @Override
67 public void handleMessage(Message msg) {
68 onHandleIntent((Intent)msg.obj);
69 stopSelf(msg.arg1);
70 }
71 }
可以看到onreate()创建了HandlerThread对象使用mName 作为参数,HandlerThread内部会创建Looper和MessageQueue。然后创建ServiceHandler对象(ServiceHandler继承Handler)并且绑定Looper对象。
onstart():
130 */
131 @Override
132 public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
133 onStart(intent, startId);
134 return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
135 }
116
117 @Override
118 public void onStart(@Nullable Intent intent, int startId) {
119 Message msg = mServiceHandler.obtainMessage();
120 msg.arg1 = startId;
121 msg.obj = intent;
122 mServiceHandler.sendMessage(msg);
123 }
可以看到在onStartCommand()中调用了onstart(),onstart使用Handler发送了消息。handler的handleMessage()就会接收到消息,然后执行 onHandleIntent(),onHandleIntent又是抽象方法。因此我们继承IntentService时只需要重写onHandleIntent()方法即可。
private final class ServiceHandler extends Handler {
62 public ServiceHandler(Looper looper) {
63 super(looper);
64 }
65
66 @Override
67 public void handleMessage(Message msg) {
68 onHandleIntent((Intent)msg.obj);
//每次执行完任务都尝试关闭service,当MessageQueue没有消息时service关闭成功
69 stopSelf(msg.arg1);
70 }
71 }
总结:
1.IntentService是一个service,也是一个抽象类;
2.IntentService内部封装这一个HandlerThread,HandlerThread又维护着Looper与消息队列,通过创建Handler对象和HandlerThread的Lopper绑定,就可以实现不断的向HandlerThread发送消息执行任务。
3.每次IntentService后台任务执行完成之后都会尝试关闭自身,但是当且仅当IntentService消息队列中最后一个消息被执行完成之后才会真正的stop自身;
4.真正执行任务是在handler的handleMessage()方法中,handleMessage又调用onHandlerIntent(),因此用户需要实现onHandlerIntent()