Java 在调用Activity.Recreate()之后,最好的方法是什么来维护我的活动的backbackback?

Java 在调用Activity.Recreate()之后,最好的方法是什么来维护我的活动的backbackback?,java,c#,android,xamarin,xamarin.android,Java,C#,Android,Xamarin,Xamarin.android,我有一个活动,它处理许多片段,对于backstack管理,我有一个自定义堆栈,在其中我管理片段的显示/隐藏。我的代码和导航工作得很好 现在,我正在通过配置片段中的按钮实现应用程序主题更改。为此,我使用更改主题的方法,配置片段的数据保留为相同的数据,并且应用程序的主题完全更改,但是片段的回退消失,原因是,当按下后退按钮时,它离开应用程序,而不是将我发送回片段或以前的活动,从那里我访问了配置片段 什么是保持我活动的最佳方式?这是可能的吗 重要提示:仅当活动。重新创建()时,因为如果活动以任何其他方式

我有一个
活动
,它处理许多
片段
,对于
backstack
管理,我有一个自定义堆栈,在其中我管理
片段的显示/隐藏。我的代码和导航工作得很好

现在,我正在通过
配置片段中的
按钮
实现应用程序主题更改。为此,我使用更改主题的方法,配置片段的数据保留为相同的数据,并且应用程序的主题完全更改,但是片段的回退消失,原因是,当按下后退按钮时,它离开应用程序,而不是将我发送回片段或以前的活动,从那里我访问了
配置片段

什么是保持我活动的最佳方式?这是可能的吗

重要提示:仅当
活动。重新创建()时,因为如果活动以任何其他方式被破坏,我不希望返回,我希望我的活动干净

附加:

  • 我的应用程序的方向设置处于纵向模式
  • 我的活动的
    launchMode
    singleTask
    ,对于我正在执行的应用程序类型,它必须是这样
从文件和答案

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

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()

要在活动的销毁(onDestroy)和重新创建(onCreate)之间保存堆栈,请使用以下方法:

@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);
}
用于保存UI状态

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


通常,当你用原生android或语言更改应用程序的主题时,总是建议你回到应用程序的主页,我的意思是重新启动应用程序,这是唯一正确的方法,另一方面,如果您使用recreate,它将破坏您当前的活动实例,因此清除所有的片段backstack,您可能会说您将把片段backstack保存在某个地方,并使用bundle实例像以前一样重新创建它们(我不建议这样做,因为它容易出现人为错误,并且不会有所需的op)
@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);
}