0

我已经阅读了有关 Android API Level 26 中新背景限制的 Android 文档,考虑到这些,我设计了我的应用程序如下:

  • 该应用程序具有BroadcastReceiver收听"SMS_RECEIVED"广播的功能。这是一个隐式广播,现在在 Oreo 中受到限制,但它是例外列表中的一个。
  • 当它BroadcastReceiver运行时,它会将一个新任务排入队列,由 a 执行JobIntentService。接收广播时,应用程序应暂时列入白名单,因此JobIntentService有机会做它的事情。

即使我从“最近的应用程序”列表中关闭该应用程序,所有这些似乎都工作得很好。但是,我收到一些用户的报告,显然每隔几天,他们必须再次打开该应用程序,因为它突然停止在后台工作。

为什么操作系统突然停止向"SMS_RECEIVED"我的应用程序发送广播?如果不是这样,那一定是JobIntentService不允许运行。为什么不?该应用程序应在收到短信后立即列入白名单。我有什么误解?

4

1 回答 1

2

除了 Doze,Android 还包含称为App Standby的功能。根据文档:

App Standby 会延迟用户最近未与之交互的应用程序的后台网络活动。

默认的“最近互动”时间范围是 3 天,这与您报告的“显然每隔几天”停止的事情相对应。

因此,似乎正在发生的是您的JobIntentService火灾(您的应用在收到广播后确实仍被列入白名单),但 App Standby 阻止您JobIntentService连接到网络。

您可以按照使用 App Standby 说明测试您的应用程序来确认这种情况:

adb shell dumpsys battery unplug
adb shell am set-inactive <packageName> true

您可以考虑查看可接受的用例以将其列入白名单,看看是否要求忽略电池优化是您的用例的一个选项。

于 2018-07-22T01:42:06.103 回答