IntentService 的 START_STICKY

Posted

技术标签:

【中文标题】IntentService 的 START_STICKY【英文标题】:START_STICKY for IntentService 【发布时间】:2014-08-23 14:37:59 【问题描述】:

我见过很多 android 服务示例,其中 return START_STICKY 用于在启动时启动应用程序,但无论如何我可以将其用于 IntentService。我了解 Service 方法在主 UI 线程上运行,而 IntentService 作为单独的线程运行。

    但是它们究竟如何被调用以及为什么不能在启动时启动 IntentService。由于 IntentService 在单独的线程上运行,因此如果我没有佩戴,我们可以对其进行更多控制。

    我尝试在 IntentService 中使用 onStartCommand,但我的应用程序在启动时崩溃,即使它在手动启动时运行良好。我们可以覆盖 IntentService 中的 onStartCommand 吗?

有人可以帮我解决这个问题吗?

【问题讨论】:

【参考方案1】:

在启动时运行和START_STICKY 彼此无关 - START_STICKY 是一个标志,用于确定如果您的服务被 Android 杀死会发生什么。

IntentService 旨在处理传入的意图(通过handleIntent)并在之后立即停止。正如在source of IntentService 中看到的,它已经适当地处理了onStartCommand

只要你提出要求

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

并在您的IntentService 上使用正确的意图过滤器:

<intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
    <action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>

然后您的服务将在启动完成时被调用。

(一个例外情况是,如果您的应用程序按照install location 安装在 SD 卡上)

【讨论】:

以上是关于IntentService 的 START_STICKY的主要内容,如果未能解决你的问题,请参考以下文章

IntentService 源码分析

IntentService与Service的区别

android 中IntentService的使用场景

IntentService:如何正确入队?

Android IntentService

IntentService,用完即走