本文分析基于Android9.0
可能有人会好奇,安卓四大组件不是有Service,还需要这个IntentService做什么?
先看这个类中的成员变量
private volatile Looper mServiceLooper;
private volatile ServiceHandler mServiceHandler;
private String mName;
private boolean mRedelivery;
发现有Looper和ServiceHandler。
熟悉Handler的朋友,到这你可能就大概知道了,IntentService的功能和线程间通信有关了吧。
一个类,要了解它,就看它的成员变量和构造方法开始,接下来看构造方法
public IntentService(String name) {
super();
mName = name;
}
构造方法主要是给工作线程起了个名称,调试用的。
而工作线程的创建以及起名字在:
@Override
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
既然有HandlerThread和Looper以及这个ServiceHandler。
那发消息在哪?
@Override
public void onStart(@Nullable Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
接收消息在哪?
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 setIntentRedelivery(boolean enabled) {
mRedelivery = enabled;
}
这个方法主要是和onStartCommand相关。(IntentService的子类禁止重写此方法)
https://www.cnblogs.com/huazaizai/p/3792847.html
主要是设置类似需求的事情,通常设置在拓展类的构造方法里。
设置mRedelivery=true,则如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
设置mRedelivery=false,则如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
进而决定onStartCommand的最终返回值。
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
终止Looper,不再接收发来的Message了。
@Override
public void onDestroy() {
mServiceLooper.quit();
}
因为是startService,所以它很空虚和。。
@Override
@Nullable
public IBinder onBind(Intent intent) {
return null;
}
到这,重头戏才出来——onHandleIntent
@WorkerThread
protected abstract void onHandleIntent(@Nullable Intent intent);
看的很清楚,它在拓展类中扮演的角色是在工作线程。
当耗时任务处理完,它里面有自动停止服务的方法。
最后,请允许我放一大段英文,因为重要的方法,每人理解不同,请你自己理解。
*This method is invoked on the worker thread with a request to process.
* Only one Intent is processed at a time, but the processing happens on a worker thread that runs independently from other application logic.
* So, if this code takes a long time, it will hold up other requests to the same IntentService, but it will not hold up anything else.
* When all requests have been handled, the IntentService stops itself,so you should not call .
下班了,我要回去了。先这样了。