一次性权限导致后台预定作业和警报被取消

问题描述

我们开发了一个Android SDK,并且在测试Android 11 Beta时,发现了一个似乎尚未报告的问题。

在Android 11中,已为“位置”,“麦克风”和“摄像头”权限引入了新的一次性权限。使用此选项,一旦用户离开应用程序,权限就会被撤销(更多详细信息,请here)。

问题在于,在短时间内应用程序不再处于前台(不必杀死应用程序,只需将其最小化就足够了)之后,所有未来计划的警报或作业都将被删除,就像应用被强行杀死。 仅在此级别的权限下会发生这种情况。 拒绝或提供其他级别将按预期保留先前计划的警报或作业。 我们已经在Beta 3版本中使用RPB3.200720.005版本号在Pixel 2仿真器中复制了此代码。在此repo中,您可以找到用于重现该错误的示例应用。

这个单一活动的应用程序安排警报在接下来的五分钟内响起,并计划在5到6分钟内触发。 屏幕上有三个按钮,每个按钮触发相应的权限请求。 JobService和BroadcastReceiver类仅记录它们已被触发。 可以按照以下步骤重现该情况:

  1. 无论何时启动该应用程序,都可以同时运行adb shell dumpsys alarm | grep com.example.permissions.appadb shell dumpsys jobscheduler | grep com.example.permissions.app来查看警报和作业是否已排定;
  2. 单击任意按钮并授予一次性权限级别;
  3. 最小化应用程序(您可以转到主屏幕或打开其他应用程序);
  4. 大约一分钟后,同时运行adb shell dumpsys alarm | grep com.example.permissions.appadb shell dumpsys jobscheduler | grep com.example.permissions.app。警报和作业将不再显示;
  5. 等待作业和警报的原始计划时间(宽容系统延迟)将显示它们不会被触发。

你们中有人遇到过类似情况吗?我们的直觉是,要撤销一次性权限,应用程序进程将以某种方式被杀死,从而导致这些副作用。 我们还在Android Issue Tracker上发布了一个问题,如果Google回答,我们将保持最新状态。

解决方法

问题已“解决”。问题实际上出在关闭应用程序后撤销权限时,Android Studio调用了强制关闭。

Google的实际答复:

非常感谢您提出此问题,并提供了示例代码 复制它。经过进一步调查,我们发现 是由于Android Studio和通过以下方式启动的应用之间的交互作用 “运行”命令。

具体来说,当Android撤消应用程序的许可时,它会杀死该用户 应用程序的过程。我们发现Android Studio发送了强制停止命令 通过adb观察到它启动的应用程序不再运行。

如果该应用是通过启动器(包括在模拟器中)启动的 (已连接到Android Studio),该应用未强制停止,并且 警报和作业均按预期运行。

因此,除非在开发阶段,否则不会引起其他问题。有关更多信息,请查看问题中链接的Android问题跟踪器。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...