代码之家  ›  专栏  ›  技术社区  ›  WenChao

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

  •  12
  • WenChao  · 技术社区  · 9 年前

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

    我有一个活动中的地图片段。易于理解的 打开“存储”权限以允许显示地图,工作正常。 按下Home(主页)按钮,关闭Storage(存储)权限并从最近的任务中打开应用程序,应用程序崩溃。

    问题是没有调用主机Activity的onResume(),而是在主机Activity上调用onCreate()以及Map片段的onCreateView()。因此,它正在抛出异常。

    当权限更改时,应用程序进程似乎被终止,因此“活动”被重新创建。

        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)
    

    来自超级。活动的onStart()

    3 回复  |  直到 9 年前
        1
  •  1
  •   nikhil bansal    7 年前

    我对应用程序权限的动态更改也有类似的问题。经过一番挖掘,我所理解的可能对你也有帮助。

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

    这里需要注意的一点是,在终止之前,片段状态保存在savedinstance对象中。

    要停止崩溃,应该使用以下代码行获取片段实例-

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

    这里“MAP FRAG”是一个标签,你必须给你的碎片。

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

        2
  •  0
  •   WenChao    9 年前

    现在可行的解决方案是打电话 getSupportFragmentManager().popBackStackImmediate(); 以防止试图重新创建映射片段。

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

        3
  •  0
  •   Sazid    9 年前

    可能有点晚了,但将来可能会帮助其他人:)

    你应该检查一下 savedInstanceState null 将其传递给 onCreate(Bundle savedInstanceState) 。如果是 无效的 然后,启动 Fragment 像这样:

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