我已经阅读了有关Android API Level 26中新背景限制的Android文档,并牢记这些,我对应用的设计如下:
BroadcastReceiver
收听"SMS_RECEIVED"
广播。这是一个隐式广播,目前在奥利奥(Oreo)中受到限制,但这是其exceptions list中的广播之一。BroadcastReceiver
运行时,它排队一个由JobIntentService
执行的新任务。收到广播后,应用should be temporarily whitelisted和JobIntentService
就会有机会做自己的事情。即使我从“最近使用的应用程序”列表中关闭了该应用程序,所有这些似乎都可以正常工作。但是,我从一些用户那里收到报告,显然每隔几天,他们不得不再次打开该应用程序,因为该应用程序突然在后台停止运行。
为什么操作系统突然停止将广播"SMS_RECEIVED"
发送到我的应用程序?如果不是这样,则必须是不允许JobIntentService
运行。为什么不?收到短信后,应立即将该应用列入白名单。我有什么误会?
答案 0 :(得分:2)
除了打ze睡外,Android还包含名为App Standby的功能。根据文档:
App Standby推迟了用户最近未与之交互的应用程序的后台网络活动。
默认的“最近互动”时间范围是3天,这与您的报告“显然每隔几天”停止相关。
因此,似乎发生了您的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,以查看asking to ignore battery optimizations是否适合您的用例。