Android marshmallow 动态权限更改杀死所有应用程序进程

Android marshmallow dynamic permission change kills all application processes

观察:手动更改 Android 应用程序的权限会终止该应用程序的所有进程。

步骤:转到设置->应用程序 Select 应用程序和权限。禁用其中一项权限。 设备:Nexus 6 设备 运行 Android Marshmallow 6.0

当我从启动器启动应用程序时,它启动了在更改此应用程序的权限之前位于顶部的 activity。这与我们通过从 UI 多任务菜单中滑出应用程序来终止应用程序进程时的行为不同。在这种情况下,首先创建启动器 activity。 也就是说,要使应用程序在更改权限后启动时能够正常工作,它不能依赖于要启动的启动器 activity。

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

That is, for application to work correctly when launched after changing permission, it cannot have a dependency on launcher activity to be started.

多年来一直如此。例如,如果您的进程由于内存不足的情况而终止,但用户最近一直在其中(例如,在过去的半小时内),当用户访问概览屏幕时(您称之为 "UI multi-task menu" ) 并转到 return 到您的应用程序,控件将 return 到用户最后 activity 的任何新实例(即,已经在 BACK 堆栈的顶部) .

Is this expected behavior with dynamic permissions on all Android 6.0+ devices?

是的。在所有以前的 Android 设备中,对于您的进程已终止但您的任务仍然未完成且最近的其他情况,这也是预期的行为。

Why is there a difference in behavior from when the application process is killed by swiping it out from UI multitask menu?

将任务滑出概览屏幕会删除该任务。因此,当用户尝试 return 访问您的应用(例如,通过主屏幕启动器图标)时,无法重复使用该任务。

我猜杀人的理由如下。这是关于并发的。系统可能会选择 3 种可能的方法之一:

  1. 静默撤销权限。该应用程序无法对此进行检查,因为在任何 'check' 和 'use' 之间仍然可能发生撤销。

  2. 通知应用程序。这种通知必须由应用程序确认,这意味着它的线程不会再访问禁用的 API,系统现在可能会关闭 API。这很优雅,但对于没有经验的程序员来说很难编程。

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