调用 Activity.Recreate() 后维护我的 Activity 后台堆栈的最佳方法是啥?

Posted

技术标签:

【中文标题】调用 Activity.Recreate() 后维护我的 Activity 后台堆栈的最佳方法是啥?【英文标题】:What is the best way to maintain the backstack of my Activity after Activity.Recreate() is called?调用 Activity.Recreate() 后维护我的 Activity 后台堆栈的最佳方法是什么? 【发布时间】:2019-08-25 06:35:43 【问题描述】:

我有一个处理许多FragmentsActivity,并且对于backstack 管理,我有一个自定义堆栈,我在其中管理Fragments 的显示/隐藏。我的代码和导航完美无缺。

现在,我正在通过Configuration Fragment 中的Button 实现应用程序主题更改。为此我使用Activity.Recreate ();的方法来改变主题,Configuration Fragment的数据保持不变,应用的主题完美改变,但是BackStack的Fragments 消失了,原因是为什么当按下后退按钮时,它会离开应用程序,而不是让我回到 Fragment 或 Previous Activity,从那里我访问了 Configuration Fragment

维护我的 Activity 的后台堆栈的最佳方法是什么?这可能吗?

重要提示:仅在调用 Activity.Recreate(); 时,因为如果 Activity 被任何其他方式销毁,我不希望 BackStack 回来,我希望我的 Activity 干净.

补充:

我的应用程序的方向设置为纵向模式。 我的 Activity 的 launchModesingleTask,对于我正在做的应用程序类型来说一定是这样。

【问题讨论】:

通常,当您在原生 android 或语言中更改应用程序的主题时,总是建议您返回应用程序的主页,我的意思是重新启动应用程序,这个是唯一正确的方法,另一方面,如果您使用重新创建,它将破坏您当前的活动实例,因此清除所有片段回栈,您可能会说您将片段回栈保存在某处并使用捆绑实例将它们重新创建为他们是以前的(我永远不会推荐这个,因为它容易出现人为错误并且不会有所需的操作) 【参考方案1】:

来自onCreate 文档和this 答案。

将以下逻辑添加到您的代码中:

public void onCreate(Bundle savedInstanceState) 
    if (savedInstanceState == null)  
        // savedInstanceState will be null only when creating the activity for the first time
        backstack = new BackStack(); //init your backstack
     else 
      // there is a chance that your backstack will be already exists at this point
      // if not:
      // retrieve the backstack with savedInstanceState.getSerializable("stack")
    

在更改主题时清除堆栈,然后调用recreate()

// changing theme detected
bacstack.clear();
backstack = null;
recreate();

要保存销毁 (onDestroy) 和重新创建 (onCreate) Activity 之间的堆栈,请使用此方法:

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) 
    super.onSaveInstanceState(outState);
    if (backstack != null) // the check isn't necessary, you can just put a null in the bundle
        outState.putSerializable("stack", backstack);

official guide 用于保存 UI 状态

onSaveInstanceState 方法可帮助您的活动生存 配置更改和系统启动的进程死亡。 link

【讨论】:

以上是关于调用 Activity.Recreate() 后维护我的 Activity 后台堆栈的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在android 9上重新创建活动引发黑屏

Java中方法调用总结

系统调用与函数调用

java三种调用方式(同步调用/回调/异步调用)

LINUX系统调用

引用调用 vs 复制调用调用