调用 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 【问题描述】:我有一个处理许多Fragments
的Activity
,并且对于backstack
管理,我有一个自定义堆栈,我在其中管理Fragments
的显示/隐藏。我的代码和导航完美无缺。
现在,我正在通过Configuration Fragment
中的Button
实现应用程序主题更改。为此我使用Activity.Recreate ();的方法来改变主题,Configuration Fragment的数据保持不变,应用的主题完美改变,但是BackStack的Fragments 消失了,原因是为什么当按下后退按钮时,它会离开应用程序,而不是让我回到 Fragment 或 Previous Activity,从那里我访问了 Configuration Fragment
。
维护我的 Activity 的后台堆栈的最佳方法是什么?这可能吗?
重要提示:仅在调用 Activity.Recreate();
时,因为如果 Activity 被任何其他方式销毁,我不希望 BackStack 回来,我希望我的 Activity 干净.
补充:
我的应用程序的方向设置为纵向模式。 我的 Activity 的launchMode
是 singleTask
,对于我正在做的应用程序类型来说一定是这样。
【问题讨论】:
通常,当您在原生 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 后台堆栈的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章