【问题标题】:Activity restart every time when disable permission from setting每次禁用设置权限时重新启动活动
【发布时间】:2019-02-28 00:35:37
【问题描述】:

我正在开发一个具有以下结构的android应用程序:MainActivity->FragmentA->FragmentB->Fragment C

现在在 Fragment C 中,我转到权限设置并让访问相机拒绝,然后我返回一个应用程序。我意识到该应用程序重新启动(转移到片段 A)。请您给我任何解决它的理由和建议。

【问题讨论】:

  • 请在您的问题中添加代码
  • 这是预期的系统行为,当任何权限被撤销时,应用程序会被强制终止,以防止任何潜在的运行时错误出现在需要的地方。
  • 正如我上面解释的,当我禁用设置权限然后应用程序重新启动,所以这里不需要示例代码。
  • @Pawel 我知道,但如何处理这类问题。
  • @Pawel 它取决于对请求权限的响应中定义的行为。许多应用程序不会因为您拒绝某些运行时权限而停止。以 WhatsApp 为例:当您第一次运行应用程序时,他们会请求消息/短信权限,以便他们可以检测帐户链接上的验证码。如果你拒绝,它根本不会检测到验证码,你必须自己输入。 Darshan Mistry 请添加一些代码,以便我们更清楚问题所在。

标签: android android-fragments android-permissions


【解决方案1】:

这是 AOSP 中正常和预期的事情。 Android 会在将所有状态和片段保存在 FragmentManager 中的同时终止应用程序进程,因此您应该从您提交游览片段的FragmentManager 中取回您的片段。查看示例方法:

// Try to retrieve fragment from fragment manager
ExampleFragment exampleFragment = (ExampleFragment) getSupportFragmentManager().findFragmentByTag("ExampleFragment");
// Fragment was not saved in fragment manager, create a new instance
if (exampleFragment == null) exampleFragment = ExampleFragment.newInstance();

请注意,我在此处(在活动中)使用getSupportFragmentManager() 作为示例,但您必须在片段中使用getChildFragmentManager()

【讨论】:

    【解决方案2】:

    当您从应用设置中撤消权限时 - Activity 及其所有组件也会重新启动。但在 onCreate(...) savedInstanceState 不等于 null。

    因此你可以使用这样的 hack:

    if (savedInstanceState != null) {

    }

    使用上面的hack app恢复最后一个fragmentC。

    【讨论】:

    • 会影响清除单例对象的值吗?我观察到同样的情况,任何持久化单例对象值的解决方案。
    猜你喜欢
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 2021-07-05
    相关资源
    最近更新 更多