IntentService继承自Service,适合处理短任务,核心实现是
ServiceHandler和Looper
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);
}
}
ServiceHandler直接继承Handler,handleMessage只做了两件事,onHandleIntent stopSelf
@Override
public void onCreate() {
// TODO: It would be nice to have an option to hold a partial wakelock
// during processing, and to have a static startService(Context, Intent)
// method that would launch the service & hand off a wakelock.
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
在onCreate中,先new了一个HandlerThread,之后再通过thread的Looper,再通过looper初始化ServiceHandler
@Override
public void onStart(@Nullable Intent intent,int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
在onStart中,初始化一个Message,并发送出去
@Override
public int onStartCommand(@Nullable Intent intent,int flags,int startId) {
onStart(intent,startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
onStartCommand中调用onstart发送消息,执行HandleMessage中的onHandleIntent方法,之后马上stopSelf
虽然使用起来很简单,源码也很清晰,不过在R上就会被废弃,现查看源码已经是被废弃的状态,感觉更像是一个过渡品,尤其是在Android8之后,后台执行限制导致会抛出
Caused by: java.lang.IllegalStateException: Not allowed to start service Intent: app is in background
应用在后台几分钟之后,不能将通过startService方式进行创建后台服务,
给出的替代解决方案是WorkManager和JobIntentService方式
JobIntentService依旧继承Service,创建工作线程处理多线程任务,线程优先级较高,不用手动结束(设计上也没有手动取消的方法),自动关闭服务,下篇文章将详细介绍另外两种组件
网友评论