一、前言
我们有时候会在service做一些耗时任务,需要自己创建子线程,那么有没有系统封装好的service,可以直接进行耗时任务呢,有的,那就是今天我们要说的IntentService 。ok,那我们下面就说一下它的使用,以及它的原理。
二、IntentService 的使用
IntentService 是抽象类,我们使用它是必须创建一个新类继承它。
public class MyIntentService extends IntentService {
public MyIntentService(String name) {
super(name);
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
//该方法就可以做耗时任务
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
}
Intent intent = new Intent(content, MyIntentService.class);
startService(intent);
就是这么简单,onHandleIntent中做耗时操作就行。
三、IntentService 源码分析
源码牵扯到HandlerThread,不会的可以看我另外一篇文章https://blog.youkuaiyun.com/qq_32650001/article/details/100015342
HandlerThread 原理分析
public abstract class IntentService extends Service {
private volatile Looper mServiceLooper;
private volatile ServiceHandler mServiceHandler;
private String mName;
private boolean mRedelivery;
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);//回调onHandleIntent,这是在子线程哦
//不懂看HandlerThread
stopSelf(msg.arg1);//结束
}
}
public IntentService(String name) {
super();
mName = name;
}
public void setIntentRedelivery(boolean enabled) {
mRedelivery = enabled;
}
@Override
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
//创建HandlerThread
thread.start();//开启
mServiceLooper = thread.getLooper();//获取当前线程looper对象
mServiceHandler = new ServiceHandler(mServiceLooper);//创建handler对象,绑定当前looper
}
@Override
public void onStart(@Nullable Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);//发送Message
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
onStart(intent, startId);//每次都会调用onStart哦
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);
}
首先启动Service,走onCreat方法,我们看到创建了一个HandlerThread对象,我们都知道HandlerThread继承了Thread,自带looper循环。ok,继续看同时创建了一个ServiceHandler (IntentService的内部类继承Handler)对象。这个时候我们start方法,我们看onStart方法中,我们用handler发送了消息。那么肯定会运行到handleMessage中,这个是在子线程中,为啥,去看HandlerThread。然后就回调到onHandleIntent中了,最后子线程运行完stopSelf(msg.arg1)结束。
四、总结
上面总结源码挺清楚的了,不懂请给我留言,谢谢拜~