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

时间:2015-10-07 12:23:14

标签: android methods permissions callback

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

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:6)

这是我的解决方案:

我在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崩溃了。重新创建应用程序时会出现此崩溃!

查看此link了解详情。

答案 1 :(得分:4)

正如已经指出的,正确的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

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