首页 > 解决方案 > 一次性权限导致后台计划作业和警报被取消

问题描述

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

在 Android 11 中,为位置、麦克风和相机权限引入了新的一次性权限。使用此选项,一旦用户离开应用程序,权限就会被撤销(更多细节可以在这里找到)。

问题是在应用程序不再处于前台的短时间内(没有必要杀死应用程序,只需最小化就足够了),所有未来计划的警报或作业都会被删除,就好像应用程序是强制的被杀。这只发生在此级别的权限下。拒绝或提供其他级别会按预期保留先前安排的警报或作业。我们已经在 Beta 3 版本中重现了这一点,它是在具有 RPB3.200720.005 版本号的 Pixel 2 模拟器中。在这个repo中,你可以找到一个用于重现 bug 的示例应用程序。

这个单一的活动应用程序安排在接下来的五分钟内响起警报,以及在 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 问题跟踪器上提交了一个问题,如果 Google 回答,我们将保持更新此帖子。

标签: androidalarmmanagerandroid-permissionsandroid-11

解决方案


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

我在 viewpager 中有 2 个 SupportMapFragment 并在 TabLayout 中连接,每次发生这种情况时,都会重新创建视图,但是无法正确重新创建位于 viewpager 当前位置的片段。

对于那些也遇到这种情况的人,您必须更改流程并仅使用 1 个 SupportMapFragment 而不是两个。这样,您的地图片段将正确重新创建。我只是根据标签当前位置处理地图状态和标记


推荐阅读