一次性权限导致后台计划作业和警报被取消
Posted
技术标签:
【中文标题】一次性权限导致后台计划作业和警报被取消【英文标题】:One-time permissions causing background scheduled jobs and alarms to be cancelled 【发布时间】:2020-12-10 04:10:15 【问题描述】:我们开发了一个 android SDK,在测试 Android 11 Beta 时,我们发现了一个似乎尚未报告的问题。
在 Android 11 中,为位置、麦克风和相机权限引入了新的一次性权限。使用此选项,一旦用户离开应用程序,权限就会被撤销(更多详细信息可以找到here)。
问题是,当应用程序不再处于前台的一小段时间后(没有必要杀死应用程序,只需最小化就足够了),所有未来计划的警报或作业都被删除,好像应用程序被强行杀死。 这只发生在此级别的权限下。 拒绝或提供其他级别会按预期保留先前安排的警报或作业。 我们已经在 Beta 3 版本中重现了这一点,它是在具有 RPB3.200720.005 版本号的 Pixel 2 模拟器中。在repo 中,您可以找到重现该错误的示例应用程序。
这个单一的活动应用程序安排在接下来的五分钟内响起警报,以及在 5-6 分钟内触发的工作。 屏幕上有三个按钮,每个按钮触发相应的权限请求。 JobService 和 BroadcastReceiver 类仅记录它们已被触发。 通过以下步骤可以重现这种情况:
-
无论何时启动应用程序,都可以运行
adb shell dumpsys alarm | grep com.example.permissions.app
和adb shell dumpsys jobscheduler | grep com.example.permissions.app
以查看警报和作业都已安排好;
单击任一按钮并授予一次性权限级别;
最小化应用(您可以转到主屏幕或打开其他应用);
大约一分钟后,运行adb shell dumpsys alarm | grep com.example.permissions.app
和adb shell dumpsys jobscheduler | grep com.example.permissions.app
。警报和作业将不再出现;
等待作业和警报的原始计划时间(对系统延迟宽容)将表明它们不会被触发。
你们中有人遇到过类似的情况吗?我们的直觉是,为了撤销一次性权限,应用程序进程会以某种方式被杀死,从而导致这些副作用。 我们还在Android Issue Tracker 上提交了一个问题,如果谷歌回复了,我们会及时更新这篇文章。
【问题讨论】:
不确定最终版本的 Android 11 是否会修复,但您可以在此处阅读:commonsware.com/blog/2020/08/28/… 【参考方案1】:问题已“解决”。问题实际上是 Android Studio 在关闭应用程序后撤销权限时调用强制关闭。
Google 的实际回应:
非常感谢您提出此问题并提供示例代码 重现它。经过进一步调查,我们发现这 是由于 Android Studio 和通过 “运行”命令。
具体来说,当 Android 撤销应用程序的权限时,它会杀死该应用程序 应用程序的过程。我们发现 Android Studio 发送了强制停止命令 当它观察到它启动的应用程序不再运行时通过 adb。
如果应用是通过启动器启动的(包括在模拟器中) 已连接到 Android Studio),应用程序未强制停止,并且 警报和作业都按预期运行。
因此它不会导致其他问题,除非在开发阶段。如需更多信息,请查看问题中链接的 Android 问题跟踪器。
【讨论】:
以上是关于一次性权限导致后台计划作业和警报被取消的主要内容,如果未能解决你的问题,请参考以下文章