问题描述
我们开发了一个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上发布了一个问题,如果Google回答,我们将保持最新状态。
解决方法
问题已“解决”。问题实际上出在关闭应用程序后撤销权限时,Android Studio调用了强制关闭。
Google的实际答复:
非常感谢您提出此问题,并提供了示例代码 复制它。经过进一步调查,我们发现 是由于Android Studio和通过以下方式启动的应用之间的交互作用 “运行”命令。
具体来说,当Android撤消应用程序的许可时,它会杀死该用户 应用程序的过程。我们发现Android Studio发送了强制停止命令 通过adb观察到它启动的应用程序不再运行。
如果该应用是通过启动器(包括在模拟器中)启动的 (已连接到Android Studio),该应用未强制停止,并且 警报和作业均按预期运行。
因此,除非在开发阶段,否则不会引起其他问题。有关更多信息,请查看问题中链接的Android问题跟踪器。