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

acs*_*eam 16 permissions methods android callback

我想在我的应用程序中使用android 6的权限,但我看到一个奇怪的事件.也许你可以帮助我.

如果您使用"危险"权限启动应用程序,则这些权限将显示在Android设备的"应用程序权限"中.完善!

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

如果您未触及权限,或者您启用了权限=>,则转到onStart和其他人.

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

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

我尝试onCreate onStart onResume onRestart onRestoreInstanceState onActionModeStarted onRestoreInstanceState onPostResume onContentChanged

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

acs*_*eam 7

这是我的解决方案:

我在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();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

请查看此链接以获取更多信息.


eug*_*man 6

正如已经指出的,正确的android正在重新启动您的应用。这与您的应用程序在后台并且系统在使用更多内存时终止您的应用程序时的行为相同。当您返回到应用程序时,将发生的是重新创建了上一个包含inclusiv片段的活动。

通常,启动屏幕(启动屏幕)用于初始化应用程序。一旦应用程序初始化(例如,服务,视图模型已准备就绪),启动活动便切换到主要活动。

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

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

Xamarin示例代码:

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

一旦调用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
Run Code Online (Sandbox Code Playgroud)

通过图标或最近的任务重新启动您的应用