美文网首页
【白水日记】IntentService

【白水日记】IntentService

作者: d2665f7588cb | 来源:发表于2021-02-24 09:52 被阅读0次

    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,创建工作线程处理多线程任务,线程优先级较高,不用手动结束(设计上也没有手动取消的方法),自动关闭服务,下篇文章将详细介绍另外两种组件

相关文章

网友评论

      本文标题:【白水日记】IntentService

      本文链接:https://www.haomeiwen.com/subject/bfxwxltx.html