IntentService 组件类的扩展 按需 Service 处理异步请求

发布于 2024-10-31 13:31:02 字数 1574 浏览 6 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

江南月

暂无简介

0 文章
0 评论
21 人气
更多

推荐作者

玍銹的英雄夢

文章 0 评论 0

我不会写诗

文章 0 评论 0

十六岁半

文章 0 评论 0

浸婚纱

文章 0 评论 0

qq_kJ6XkX

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文