SMS_RECEIVED Oreo 中的广播接收器和 JobIntentService

SMS_RECEIVED Broadcast Receiver and JobIntentService in Oreo

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

所有这些似乎都运行良好,即使我从 "recent apps" 列表中关闭应用程序也是如此。但是,我收到一些用户的报告,显然每隔几天,他们必须再次打开该应用程序,因为它突然在后台停止工作。

为什么 OS 突然停止向我的应用程序发送 "SMS_RECEIVED" 广播?如果不是那个,那一定是JobIntentService不被允许运行。为什么不?该应用程序应在收到短信后立即列入白名单。我误会了什么?

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

App Standby defers background network activity for apps with which the user has not recently interacted.

默认 'recently interacted' 时间范围是 3 天,这与您报告的事情停止 'apparently every few days'。

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

您可以通过以下 Testing your app with App Standby instructions:

确认情况是否如此
adb shell dumpsys battery unplug
adb shell am set-inactive <packageName> true

您可以考虑浏览 Acceptable use cases for whitelisting to see if asking to ignore battery optimizations 是您的用例的一个选项。