IntentService 组件类的扩展 按需 Service 处理异步请求
IntentService 本质 = Handler + HandlerThread
- 按顺序、在后台执行
- 若启动 IntentService 多次,那么 每个耗时操作 则 以队列的方式 在 IntentService 的 onHandleIntent 回调方法中依次执行,执行完自动结束。但 onStartCommand 也会调用多次
- 为什么不能 bindService 去执行任务??因为并不会调用 onStart() 或 onStartcommand(),故不会将消息发送到消息队列,那么 onHandleIntent() 将不会回调,即无法实现多线程的操作,失去了它本身的意义
@Override
public void onStart(@Nullable Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
可以看到,start 之后把 intent 包装在 message 里入队
/**
* Sets intent redelivery preferences. Usually called from the constructor
* with your preferred semantics.
*
* <p>If enabled is true,
* {@link #onStartCommand(Intent, int, int)} will return
* {@link Service#START_REDELIVER_INTENT}, so if this process dies before
* {@link #onHandleIntent(Intent)} returns, the process will be restarted
* and the intent redelivered. If multiple Intents have been sent, only
* the most recent one is guaranteed to be redelivered.
*
* <p>If enabled is false (the default),
* {@link #onStartCommand(Intent, int, int)} will return
* {@link Service#START_NOT_STICKY}, and if the process dies, the Intent
* dies along with it.
*/
public void setIntentRedelivery(boolean enabled) {
mRedelivery = enabled;
}
还有个 redelivery 功能:如果任务执行完成之前 Service 挂了会自动 restart,然后处理最近的一个 intent
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: Java equals() 判断是否相等
下一篇: MyBatis 介绍和使用
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论