2 题: Android 6 Permissions =>禁用权限时崩溃并返回应用程序

在...创建的问题 Wed, Oct 7, 2015 12:00 AM

我想在我的应用程序中使用android 6的权限,但我看到一个奇怪的事件。也许你可以帮我解决这个问题。

如果您使用“危险”权限启动应用,则这些权限会显示在Android设备的“应用权限”中。 PERFECT!

但如果您将应用程序保留在后台,请转到“应用程序权限”菜单,禁用(您可以启用然后禁用它)权限并返回到您的应用程序,android永远不会转到onStart(片段或活动) ?!永远不要再去那里了。

如果您未触及该权限,或者您启用了权限=>它会转到onStart和其他人。

这有问题,例如,如果您的应用使用了侦听器,则无法重新启动它,您可能会崩溃......

您是否知道Android禁用权限时的方法?

我试过了     的onCreate     在onStart     的onResume     onRestart     onRestoreInstanceState     onActionModeStarted     onRestoreInstanceState     onPostResume     onContentChanged

......但没办法......:/

    
16
  1. “android永远不会去onStart(碎片或活动)?!而且再也不去那里了。” - 如果用户撤消“设置”中的权限,Android将终止您的进程。如果Android在后台运行时出于任何其他原因终止您的进程,则可以采用相同的方式处理此问题。
    2015-10-07 12:24:02Z
  2. 感谢您的回答!我继续调查。当我创建我的活动时,我显示1个片段。如果我更改权限并返回应用程序,则有2个片段(权限更改之前和之后的片段)。你知道为什么保留旧片段吗?
    2015-10-07 13:04:05Z
  3. “你知道保留旧片段的原因吗?” - 因为您的任务仍然很出色,因此Android会重新创建活动并尽可能恢复其状态,包括重新创建任何现有的碎片。如果您进行配置更改(例如,旋转屏幕),您将获得相同的结果,因为默认情况下您的活动将被销毁并重新创建。在添加片段之前检查片段是否存在。
    2015-10-07 13:07:42Z
  4. 非常感谢!!!那现在好多了! :P
    2015-10-07 13:29:16Z
  5. 我们也遇到了同样的问题。它固定了吗?
    2016-03-03 11:54:36Z
  6. 醇>
    2个答案                              2 跨度>                         

    这是我的解决方案:

    我在mainActivity中使用了一些片段。

    如您所知,当用户禁用权限时,会重新创建活动=>通过onCreate,...

    我在mainActivity的onCreate(...)中做了什么,我删除了所有加载的片段,并将我的应用程序置于与第一次运行相同的状态。

    像这样:

     
        // Clean fragments (only if the app is recreated (When user disable permission))
        FragmentManager fragmentManager = getSupportFragmentManager();
        if (fragmentManager.getBackStackEntryCount() > 0) {
            fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        }
    
        // Remove previous fragments (case of the app was restarted after changed permission on android 6 and higher)
        List<Fragment> fragmentList = fragmentManager.getFragments();
        if (fragmentList != null) {
            for (Fragment fragment : fragmentList) {
                if (fragment != null) {
                    fragmentManager.beginTransaction().remove(fragment).commit();
                }
            }
        }
    

    小心!!! :我的appcompat和设计库版本23.2.0崩溃了。重新创建应用程序时会出现此崩溃!

    检查此链接了解更多信息。

        
    7
    2017-05-23 10:30:41Z
    1. 当我们知道重新创建活动时,
      获得崩溃“碎片不再存在”。
      2016-03-22 09:02:32Z
    2. @ Santosh你可以检查片段管理器是否有上面写的任何片段,或者你使用我的解决方案并在应用程序类中保持初始化状态。您的应用通常从启动行为开始如果重启,ivity启动画面会跳过启动活动并直接显示最后一个活动。
      2018-09-25 12:58:57Z
    3. 醇>

    正如已经指出的,正确的android正在重启您的应用程序。这与您的应用程序处于后台时的行为相同,并且系统会在使用更多内存时杀死您的应用程序。 返回应用程序时会发生的事情是重新创建最后一个包含片段的活动。

    通常使用启动屏幕(启动画面)来初始化应用程序。 初始化应用程序后(例如,服务,viewmodel已准备好),启动活动将切换到主要活动。

    在重新创建应用程序时,许多应用程序中都会发生常见崩溃(例如撤销权限),因为应用程序未初始化且使用的服务或视图模型为null。 我认为有一种方法可以避免在重新启动应用程序后重新创建上一个活动。

    您可以做的是检查应用程序是否已初始化,否则切换到启动活动并初始化应用程序。 请注意,您必须处理活动中的单元化应用程序以及片段。

    Xamarin示例代码:

     
    if (!((MyApplication)ApplicationContext).IsInitialized)
    {
        Intent intent = new Intent(Application.Context,typeof(StartupActivity));
        intent.SetFlags(ActivityFlags.NewTask);
        StartActivity(intent);
        Finish();
    }
    

    一旦调用了base.onCreate,就会创建片段,因此即使是acs-team提供的“解决方法”也无法避免重新创建最后一个片段。

    使用上面提供的示例代码,生命周期将是活动有一个片段:

    • 撤销权限应用程序被杀
    • 重新启动应用
    • 申请OnCreate
    • LastActivity.OnCreate
    • LastFragment.OnAttach
    • LastFragment.OnCreate
    • LastFragment.OnCreateView
    • LastFragment.OnViewCreated
    • LastFragment.OnDestroy
    • LastFragment.OnDettach
    • LastActivity.OnDestroy
    • StartupActivity.OnCreate

    顺便说一下,您还可以通过adb shell测试应用重启:

    打开您的应用,然后转到Android主屏幕,以便您的应用在后台

     
    adb shell "ps | grep <com.yourpackage>" // get the app process id
    adb shell run-as <com.yourpackage> kill <app-process-id>    // kill the app
    

    再次通过图标或最近的任务启动您的应用

        
    5
    2017-11-22 20:00:08Z
    1. 你也可以发布Java示例代码吗? Java中似乎不存在IsInitialized方法。
      2018-04-17 15:38:44Z
    2. @ Cody这是您在初始化所有必需服务后在应用程序中设置的标志。它不能在Xamarin和Java中使用,你必须自己完成。
      2018-04-26 07:56:28Z
    3. @ eugstman当用户撤销任何权限时,我遇到了问题。在这种情况下,应用程序立即崩溃,并且在应用程序中没有调用生命周期事件。有什么方法可以处理这种情况吗?
      2018-08-13 13:01:48Z
    4. @JanNepraš你的应用程序被杀死,并在最后一个打开的活动中重新开始。撤消在异常中找到的权限后立即检查logcat。您也应该不进行调试,否则重启可能会失败。
      2018-08-14 11:51:54Z
    5. 如何检测从设置中删除权限的事件@eugstman
      2018-09-20 11:12:08Z
    6. 醇>
来源放置 这里