安卓棉花糖动态权限更改会终止所有应用程序进程

29

观察结果:手动更改Android应用程序的权限会杀死该应用程序的所有进程。

步骤:进入“设置”->“应用程序”,选择应用程序和权限。禁用其中一个权限。 设备:运行Android Marshmallow 6.0的Nexus 6设备。

当我从启动器启动应用程序时,它会启动在更改该应用程序权限之前处于顶部的活动。这与我们通过从UI多任务菜单中滑动应用程序以杀死应用程序进程时不同。在那种情况下,启动器活动首先创建。 也就是说,为了让应用程序在更改权限后正确启动,它不能依赖于启动器活动的启动。

这是所有Android 6.0+设备上动态权限的预期行为吗?为什么与通过从UI多任务菜单中滑动应用程序以杀死应用程序进程的行为不同?


如果您解决了这个问题,能否解释一下您是如何做到的? - Orcun Sevsay
2个回答

16
也就是说,如果应用程序在更改权限后启动,为了正确工作,它不能依赖于启动器活动。
多年来一直是这样。例如,如果您的进程由于低内存情况而终止,但用户最近(比如在过去半小时内)一直在其中,当用户访问概览屏幕(您称之为“UI多任务菜单”)并返回到您的应用时,控件将返回到用户上次所在的任何活动的新实例(即,该活动在BACK堆栈的顶部)。
这是Android 6.0+所有设备上动态权限的预期行为吗?
是的。对于您的进程已经终止但您的任务仍然未完成且是最近的其他情况,在所有之前的Android设备中也是预期的行为。
为什么从UI多任务菜单中滑动应用程序退出时会有行为差异?
从概览屏幕中滑动任务会删除该任务。因此,当用户尝试返回您的应用时(例如通过主屏幕启动器图标),该任务无法被重用。

4
我不明白为什么他们要继续保留权限更改的任务。为什么不杀死进程并删除任务呢?这会强制我们在应用程序中的每个需要检查权限的地方进行检查,而我们本可以只有一个入口点来请求它们(至少是关键部分)。你知道是否有一种方法可以在权限更改后强制启动一个新任务吗?我尝试混合各种活动配置,但失败了... - tbruyelle
6
@tbruyelle:“你知道是否有一种方法可以在权限更改后强制启动新任务吗?”-- 对于权限更改,没有专门的解决方法。如果没有其他办法,可以在每个 onCreate() 的顶部检查您是否持有权限(可能通过共用的 activity 基类),如果缺少必要的权限,则使用 Intent 标记清除任务来启动您的入口 activity,以便您的 requestPermissions() 调用可以集中处理。 - CommonsWare
谢谢,我正在设计类似的东西,我会继续。 - tbruyelle
Instagram对此问题有控制。如果您尝试从设置中禁用存储权限并恢复应用程序,则不会终止该应用程序。短暂的时间内,会显示一个白色背景;然后最近的活动将出现在它停止的地方。 - Orcun Sevsay
3
@MiloRambaldi:“如果您尝试从设置中禁用存储权限并恢复应用程序,则不会停止应用程序。”--它肯定会杀死与该应用程序相关的所有进程。Instagram无法阻止这种情况发生。“短暂地显示白色背景,然后最近的活动出现在离开的地方”--这听起来像是正常的savedInstanceState处理,同时重新加载任何必要的数据从磁盘或网络。 - CommonsWare
以下实现的 Android 文档 URL 是否存在? - Murtaza Khursheed Hussain

3
我猜这次杀死应用的理由是并发性问题。系统可能会选择三种可能的方法之一:
  1. 默默地撤销权限。应用程序无法检查此操作,因为在任何“检查”和“使用”之间,权限都可能被撤销。

  2. 向应用程序发送通知。这种类型的通知必须得到应用程序的确认,这意味着它的线程将不再访问已禁用的API,并且系统现在可以关闭该API。这是优雅的,但对于经验不足的程序员来说难以编写。

  3. 杀死应用程序,并确保下次启动时它会正确地意识到权限已被撤销。


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