【问题标题】:Android marshmallow dynamic permission change kills all application processesAndroid marshmallow 动态权限更改会杀死所有应用程序进程
【发布时间】:2016-02-02 23:36:52
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果你处理了这个问题,你能解释一下你是怎么做的吗?

标签: android android-permissions android-6.0-marshmallow


【解决方案1】:

也就是说,为了让应用程序在更改权限后启动时能够正常工作,它不能依赖于要启动的启动器活动。

多年来一直如此。例如,如果您的进程由于内存不足而终止,但用户最近(例如,在过去半小时内),当用户访问概览屏幕时(您称之为“UI 多任务menu") 并返回到您的应用程序,控制权将返回到用户上次进行的任何活动的新实例(即,一直在 BACK 堆栈的顶部)。

在所有 Android 6.0+ 设备上,这种预期行为是否具有动态权限?

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

为什么应用程序进程被从 UI 多任务菜单中滑出时的行为会有所不同?

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

【讨论】:

  • 我不明白他们为什么要保留权限更改任务。为什么不终止进程并删除任务?它迫使我们检查应用程序所需的任何地方的权限,而我们可以只有一个入口点来请求它们(至少是关键的入口点)。您知道是否有办法在权限更改后强制执行新任务?我试图混合各种活动配置,但我失败了......
  • @tbruyelle:“您知道是否有办法在权限更改后强制执行新任务?” -- 没有什么特定的权限更改。如果不出意外,请检查您是否拥有每个 onCreate() 顶部的权限(可能通过公共活动基类),如果您遗漏了一些关键内容,请使用 Intent 标志开始您的入口点活动清除任务,以便集中处理您的requestPermissions() 呼叫。
  • 谢谢我正在设计类似的东西,我会继续。
  • Instagram 对此问题有控制权。如果您尝试从设置中禁用存储权限并恢复应用程序,它不会终止应用程序。瞬间,显示了一个白色背景;然后最近的活动出现在它离开的地方。
  • @MiloRambaldi:“如果您尝试从设置中禁用存储权限并恢复应用程序,它不会杀死应用程序”——它肯定会杀死与应用程序关联的所有进程。 Instagram 无法阻止这一点。 “一会儿,显示一个白色背景;然后最近的活动出现在它离开的地方”——这听起来像是正常的savedInstanceState 处理,以及从磁盘或网络重新加载任何必要的数据。
【解决方案2】:

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

  1. 静默撤销权限。该应用无法对此进行检查,因为在任何“检查”和“使用”时刻之间仍然可能发生撤销。

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

  3. 要终止应用程序,请确保它在下次启动时正确地意识到权限已被撤销。

【讨论】:

    猜你喜欢
    • 2017-04-20
    • 2016-02-20
    • 1970-01-01
    • 2016-09-06
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多