一次性权限导致后台定时任务和闹钟被取消。

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


    2
    不确定是否会在 Android 11 的最终版本中修复,但你可以在这里阅读相关信息:https://commonsware.com/blog/2020/08/28/android-r-one-time-permission-expiration-sometimes-kills-alarms-jobs.html - android developer
    2个回答

    0

    我知道我的问题与此问题不完全相同,但在Android 11中的谷歌地图中,当我点击这个一次性权限时,我也遇到了这个问题。我注意到,如果你将你的应用程序留在后台1分钟并返回,应用程序进程将被终止。

    我在ViewPager中有2个SupportMapFragment,并与TabLayout连接,每次发生这种情况时,视图将被重新创建,但是位于ViewPager当前位置的Fragment无法正确地重新创建。

    对于那些也遇到这个问题的人,您必须更改流程,仅使用一个SupportMapFragment而不是两个。通过这种方式,您的地图片段将被正确重新创建。我只是根据选项卡当前位置处理地图状态和标记。


    0
    问题已经“解决”。实际上,问题出在Android Studio在关闭应用程序后撤销权限时调用了强制关闭。
    Google的实际回复如下:
    感谢您提出此问题并提供样本代码以重现。经过进一步调查,我们发现这是由于Android Studio和通过“运行”命令启动的应用程序之间的交互引起的。
    具体来说,当Android撤销应用程序的权限时,它会终止该应用程序的进程。我们发现,当Android Studio观察到它启动的应用程序不再运行时,它会通过adb发送一个强制停止命令。
    如果应用程序是通过启动器启动的(包括连接到Android Studio的模拟器),则不会强制停止该应用程序,并且闹钟和作业都将按预期运行。
    因此,除了开发阶段外,它不会导致其他问题。有关更多信息,请查看问题链接中的Android问题跟踪器。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接