onCreate() 在权限设置更改后从最近的任务重新打开时被调用
onCreate() gets called when reopen from recent task after permission settings is changed
题目听起来很复杂,但这是我的情况。
我在 activity 中有一个地图片段。简单的。
打开存储权限以允许显示地图,工作正常。
按主页按钮使应用程序后台运行,然后关闭存储权限并从最近的任务中打开应用程序,应用程序崩溃。
问题不是调用主机 Activity 的 onResume(),而是在主机 Activity 上调用 onCreate() 以及地图片段的 onCreateView()。因此它抛出异常。
似乎应用程序进程在更改权限时被终止,因此 Activity 被重新创建。
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() 来自 Activity
现在可行的解决方案是在 Activity 的 onCreate() 中调用 getSupportFragmentManager().popBackStackImmediate();
以防止尝试重新创建地图片段。
popBackStack() 在这种情况下不起作用,因为它是异步的。
可能有点晚了,以后可能还会帮到别人:)
您应该检查 savedInstanceState
是否是传递给 onCreate(Bundle savedInstanceState)
的 null
。如果只有 null
,则像这样启动 Fragment
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout_file);
if (savedInstanceState == null) {
// do fragment transactions here
}
}
我在应用权限的动态更改方面遇到了类似的问题。经过一番挖掘,我的理解可能对你也有帮助。
更改权限会导致系统终止您的应用程序,现在如果您从概览屏幕打开您的应用程序,它将重新启动您的应用程序,这是导致崩溃的主要原因,因为您可能正在对片段对象执行操作,现在为空。
这里要注意的重要一点是,在终止之前,片段状态保存在 savedinstance 对象中。
要停止崩溃,您应该使用这行代码获取片段实例 -
mapFragment = (MapFragment)getSupportFragmentManager().findFragmentByTag("MAP FRAG");
这里 "MAP FRAG" 是你必须给你的片段的标签。
如有不明之处,欢迎交流。
题目听起来很复杂,但这是我的情况。
我在 activity 中有一个地图片段。简单的。 打开存储权限以允许显示地图,工作正常。 按主页按钮使应用程序后台运行,然后关闭存储权限并从最近的任务中打开应用程序,应用程序崩溃。
问题不是调用主机 Activity 的 onResume(),而是在主机 Activity 上调用 onCreate() 以及地图片段的 onCreateView()。因此它抛出异常。
似乎应用程序进程在更改权限时被终止,因此 Activity 被重新创建。
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() 来自 Activity
现在可行的解决方案是在 Activity 的 onCreate() 中调用 getSupportFragmentManager().popBackStackImmediate();
以防止尝试重新创建地图片段。
popBackStack() 在这种情况下不起作用,因为它是异步的。
可能有点晚了,以后可能还会帮到别人:)
您应该检查 savedInstanceState
是否是传递给 onCreate(Bundle savedInstanceState)
的 null
。如果只有 null
,则像这样启动 Fragment
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout_file);
if (savedInstanceState == null) {
// do fragment transactions here
}
}
我在应用权限的动态更改方面遇到了类似的问题。经过一番挖掘,我的理解可能对你也有帮助。
更改权限会导致系统终止您的应用程序,现在如果您从概览屏幕打开您的应用程序,它将重新启动您的应用程序,这是导致崩溃的主要原因,因为您可能正在对片段对象执行操作,现在为空。
这里要注意的重要一点是,在终止之前,片段状态保存在 savedinstance 对象中。
要停止崩溃,您应该使用这行代码获取片段实例 -
mapFragment = (MapFragment)getSupportFragmentManager().findFragmentByTag("MAP FRAG");
这里 "MAP FRAG" 是你必须给你的片段的标签。
如有不明之处,欢迎交流。