2015-10-07 303 views
7

我想在我的应用程序中使用权限的Android 6,但我看到一个奇怪的事件。也许你可以帮我解决这个问题。Android 6权限=>崩溃时禁用权限,并返回到应用程序

如果您以“危险”权限启动您的应用程序,这些权限会显示在您的Android设备的“应用程序权限”中。完善!但是如果你在后台保留你的应用程序,进入“应用程序权限”菜单,禁用(你可以启用然后禁用它)权限并返回到你的应用程序,android永远不会去onStart(片段或活动)?!永远不要再去那里。

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

这是有问题的,对于为例,如果您的应用程序使用的听众,您不能重新启动它,你可以有一个崩溃...

你知道哪里去的Android方法时禁用权限?

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

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

+2

“机器人从来没有去在onStart(片段或活动)!并且永远不会再去那里。“ - 如果用户从设置中撤消权限,则Android会终止您的过程。如果Android在任何其他原因终止您的进程,并且您处于后台,则以同样的方式处理此问题。 – CommonsWare

+0

感谢您的回答!我继续调查,当我创建我的活动时,我显示1片段,如果我更改权限并返回应用程序,则有2个片段(权限更改之前和之后的片段)。片段是否保留? –

+0

“你知道为什么要保留旧的片段吗?” - 因为你的任务仍然非常出色,所以Android正在重新创建活动并尽其所能地恢复其状态,创建任何现有的片段,如果您进行配置更改(例如,旋转屏幕),您将获得相同的结果,因为您的活动将被销毁并默认重新创建。它。 – CommonsWare

回答

4

这里是我的解决方案:

我在mainActi中使用了一些片段VITY。

如你所知,当用户禁用权限=>办理的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

当我们知道活动重新创建?获取崩溃“片段不再存在”。 – Santosh

1

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

通常启动屏幕(启动画面)用于初始化应用程序。 一旦应用程序初始化(例如服务,viewmodel已准备就绪),启动活动将切换到主要活动。

当应用程序被重新创建(例如撤消权限)时,许多应用程序会发生常见的崩溃,因为应用程序未初始化并且使用的服务或视图模型为空。 我不认为有一种方法可以避免应用程序重新启动后最后一次活动的重新创建。

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

Xamarin示例代码:

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

只要base.onCreate被称为创建所述片段所以即使是提供“解决方法”从ACS-球队没有避免最后一个片段的娱乐。

利用上述提供的样本代码的生命周期将在壳体的活性有片段:

  • 撤销许可的应用程序就会被杀死
  • 重新启动应用程序
  • 应用的OnCreate
  • LastActivity.OnCreate
  • LastFragment.OnAttach
  • LastFragment.OnCreate
  • LastFragment.OnCreateView
  • LastFragment.OnViewCreated
  • LastFragment.OnDestroy
  • LastFragment.OnDettach
  • LastActivity.OnDestroy
  • StartupActivity.OnCreate

通过您还可以测试应用程序的方式重新启动亚行外壳:

打开你的应用程序,然后去和固醇主屏幕,以使您的应用程序在后台

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

启动您的应用程序再次在该图标或近期任务