我们开发了一个Android SDK,在测试Android 11 Beta时,我们发现一个问题,目前似乎还没有被报告过。
在Android 11中,引入了新的一次性权限,用于位置、麦克风和相机权限。使用此选项后,一旦用户离开应用程序,权限就会被撤销(更多详细信息请参见这里)。
问题在于,在应用程序不再处于前台的短时间内(不需要杀死应用程序,只需最小化即可),所有未来的定时闹钟或作业都会被删除,就好像应用程序被强制停止一样。只有在此级别的权限下才会发生这种情况。拒绝或提供其他级别将保留先前安排的闹钟或作业,正如预期的那样。我们已经在Beta 3版本中复现了这个问题,在R PB3.200720.005版本号的Pixel 2模拟器中。在这个repo中,您可以找到用于重现错误的示例应用程序。
这个单一活动的应用程序安排一个闹钟,在接下来的五分钟内响铃,并在5-6分钟之间触发一个作业。屏幕上有三个按钮,每个按钮触发相应的权限请求。JobService和BroadcastReceiver类只记录它们被触发了。
可以按照以下步骤重现该情况:每次启动应用程序时,可以运行
点击任何一个按钮并授予单次权限级别;
最小化应用程序(可以回到主屏幕或打开其他应用程序);
大约一分钟后,运行
等待原定的作业和闹钟时间(考虑到系统延迟),它们将不会被触发。
在Android 11中,引入了新的一次性权限,用于位置、麦克风和相机权限。使用此选项后,一旦用户离开应用程序,权限就会被撤销(更多详细信息请参见这里)。
问题在于,在应用程序不再处于前台的短时间内(不需要杀死应用程序,只需最小化即可),所有未来的定时闹钟或作业都会被删除,就好像应用程序被强制停止一样。只有在此级别的权限下才会发生这种情况。拒绝或提供其他级别将保留先前安排的闹钟或作业,正如预期的那样。我们已经在Beta 3版本中复现了这个问题,在R PB3.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问题跟踪器上提交了一个问题,在谷歌回答之前,我们将继续更新这篇文章。