在更改权限设置后,从最近的任务重新打开时,onCreate()会被调用

问题标题可能听起来很复杂,但这是我的情况。

我有一个活动内的地图片段。 简单。 打开存储权限以允许显示地图,工作正常。 通过按Homebutton背景应用程序,然后closures存储权限,并从最近的任务,应用程序崩溃打开应用程序。

问题不在于调用主机Activity的onResume(),而是在主机Activity以及Map碎片的onCreateView()上调用onCreate()。 因此它抛出exception。

看起来应用程序进程在更改权限时被终止,从而重新创build了活动。

09-24 14:42:55.071: E/AndroidRuntime(12918): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 09-24 14:42:55.071: E/AndroidRuntime(12918): Caused by: java.lang.NullPointerException: Attempt to write to field 'int android.support.v4.app.Fragment.mNextAnim' on a null object reference 09-24 14:42:55.071: E/AndroidRuntime(12918): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:718) 09-24 14:42:55.071: E/AndroidRuntime(12918): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489) 09-24 14:42:55.071: E/AndroidRuntime(12918): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:548) 

从活动super.onStart()

Solutions Collecting From Web of "在更改权限设置后,从最近的任务重新打开时,onCreate()会被调用"

现在可行的解决scheme只是调用getSupportFragmentManager().popBackStackImmediate(); 在Activity的onCreate()中,以防止试图重新创build地图片段。

在这种情况下popBackStack()将不起作用,因为它是asynchronous的。

大概有点晚了,还可以帮助别人在未来:)

你应该检查看看savedInstanceState是否传递给onCreate(Bundle savedInstanceState) 。 如果只有null那么像这样启动Fragment

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_layout_file); if (savedInstanceState == null) { // do fragment transactions here } } 

我有类似的问题与应用程序的权限的dynamic变化。 经过一番挖掘,我的理解也可能对你有所帮助。

更改权限会导致系统终止您的应用程序,现在如果您从总览屏幕中打开您的应用程序,它将重新启动您的应用程序,这是您的崩溃的主要原因,因为您可能正在对片段对象执行操作, 。

这里需要注意的一点很重要,就是终止片段状态保存在保存的实例对象中。

要停止崩溃,你应该使用这一行代码得到片段实例 –

 mapFragment = (MapFragment)getSupportFragmentManager().findFragmentByTag("MAP FRAG"); 

这里“MAP FRAG”是你必须给你的片段的标签。

分享,如果你有任何困惑。