如何防止片段在活动重新创建时触发 onCreate onCreateView

Posted

技术标签:

【中文标题】如何防止片段在活动重新创建时触发 onCreate onCreateView【英文标题】:how to prevent Fragments firing onCreate&onCreateView on activity recreation 【发布时间】:2013-03-09 16:27:12 【问题描述】:

所以我有活动 A、B、C 应用流程为 A->B->C

A、B 与登录功能相关联,仅启动一次即可登录。 整个应用程序都在 C Activity 中。当用户使用 C 时,A、B 仍然存在。一切正常。

现在..

我杀死了应用程序的 PID。然后从任务管理器中选择它。

A 未启动,B 未启动,C->onCreate(not null) 触发。

我可以通过检查是否存在 A 或 B 的实例来检测这种情况。 所以现在我知道这种特殊情况已经发生了,我想重新启动应用程序 -> 到活动 A,所以它是一个全新的启动。

问题是在 onCraete(not null) 中重启应用

在活动 C 中的 onCreate(not null) 中我做了这样的事情:

if (A==null or B==null)
finish;
return;

然后在活动 B 中也是如此。这有效,C 和 B 完成,A 弹出.. 但是在此期间...

fragments onCreate && onCreateView 在调用 C onDestroy 之前触发。因为我在活动 C 中有很多片段,这会导致应用程序崩溃。

所以,我的问题是。在这种情况下,有没有办法在活动 C onCreate(不为 null)(甚至在 C onCreate; 清单中?)中强制应用重启,以便不调用片段 onCreate 和 onCreateView?

P.S:我已经在 manifest 中尝试了 clearTaskonLaunch,但这会强制应用重启,即使我只是暂停/恢复屏幕。

任何建议都会有所帮助

【问题讨论】:

【参考方案1】:

我有一个非常相似的场景。似乎将null 值发送到基类的OnCreate 可以防止重新加载片段。这是我的基本 Activity 类代码的 sn-p(它在 C# Xamarin.android 中,但很简单易懂):

    protected override void OnCreate(Bundle savedInstanceState)
    
        if (IsInvalidAppState()) 
            GoToLoginActivity();
            base.OnCreate(null);
         else 
            base.OnCreate(savedInstanceState);
        
    

    private void GoToLoginActivity()
    
        var intent = new Intent(Application.Context, typeof(LoginActivity));
        intent.SetFlags(ActivityFlags.ClearTop | ActivityFlags.NewTask | ActivityFlags.ClearTask);
        StartActivity(intent);
    

    private bool IsInvalidAppState()
    
        // Figure out if everything is initialized correctly
    

【讨论】:

以上是关于如何防止片段在活动重新创建时触发 onCreate onCreateView的主要内容,如果未能解决你的问题,请参考以下文章

FragmentStatePagerAdapter视图分页器片段在重新创建活动后未显示

如何避免 FragmentManager 重新创建片段?

完成 onCreate 中的活动时,如何在 onCreate 之前调用我的片段的 onCreateView?

导航组件防止在后按时重新创建片段

从活动接收意图后如何创建片段?

从活动创建片段时getView返回null