android - 一次性权限导致后台计划作业和警报被取消
问题描述
我们开发了一个 Android SDK,在测试 Android 11 Beta 时,我们发现了一个似乎尚未报告的问题。
在 Android 11 中,为位置、麦克风和相机权限引入了新的一次性权限。使用此选项,一旦用户离开应用程序,权限就会被撤销(更多细节可以在这里找到)。
问题是在应用程序不再处于前台的短时间内(没有必要杀死应用程序,只需最小化就足够了),所有未来计划的警报或作业都会被删除,就好像应用程序是强制的被杀。这只发生在此级别的权限下。拒绝或提供其他级别会按预期保留先前安排的警报或作业。我们已经在 Beta 3 版本中重现了这一点,它是在具有 RPB3.200720.005 版本号的 Pixel 2 模拟器中。在这个repo中,你可以找到一个用于重现 bug 的示例应用程序。
这个单一的活动应用程序安排在接下来的五分钟内响起警报,以及在 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 问题跟踪器上提交了一个问题,如果 Google 回答,我们将保持更新此帖子。
解决方案
我知道我的问题与这个问题不完全一样,但是当我点击这个一次性权限时,我也在谷歌地图的 android 11 中遇到了这个问题。我注意到,如果您将应用程序留在后台 1 分钟然后返回,则应用程序进程被终止。
我在 viewpager 中有 2 个 SupportMapFragment 并在 TabLayout 中连接,每次发生这种情况时,都会重新创建视图,但是无法正确重新创建位于 viewpager 当前位置的片段。
对于那些也遇到这种情况的人,您必须更改流程并仅使用 1 个 SupportMapFragment 而不是两个。这样,您的地图片段将正确重新创建。我只是根据标签当前位置处理地图状态和标记
推荐阅读
- git - Mac 到 EC2 - 源代码控制三角问题 - git?同步?什么?
- amazon-cloudfront - 如何使用路由 53、云端分发和弹性 beantalk 修复 504 错误
- mysql - 正向工程 EER 图时出现错误 1005
- swift - countDownTimerLabel 中单词“minutes”和“seconds”的本地化
- node.js - react/nodejs 中的优化请求/响应
- mysql - 试图在一个查询中连接两个部分
- c# - 如何在winforms c#中冒泡事件?
- python - 在没有 QLineEdit 的情况下获取 RFID 文本
- c# - 在mongodb中,获取第一个和最后一个文档的最有效方法是什么
- bash - 带有openssl的AES(aes-cbc-256)加密/解密预期输出被截断