【问题标题】:What happens to fragments after the system kills an app?系统杀死应用程序后碎片会发生什么?
【发布时间】:2015-07-17 02:12:28
【问题描述】:

“如果一个活动被暂停或停止,系统可以通过要求它完成或简单地终止它的进程来从内存中删除该活动。”。当用户返回 Activity 时,它会使用捆绑包恢复其状态。

我的问题是:

在oncreate中这样做重要吗:

if(savedinstance != null)
{
    fragement = fm.findFragmentByTag("tag");
}
else
{
    fragment = new Fragment();
    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.add(R.id.webViewFrame,fragment,"tag");
    ft.commit()
}

而不仅仅是这样:

    fragment = new Fragment();
    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.add(R.id.webViewFrame,fragment,"tag");
    ft.commit()

【问题讨论】:

  • 根据我的理解,你应该使用第一个。片段可能已经在后堆栈上。在这种情况下,当您回到托管活动时,无需获取片段的新实例,堆栈上的实例可以弹出显示。

标签: android fragment state


【解决方案1】:

如果您在onSaveInstanceState() 中正确保存了活动和片段的状态,并且希望活动在其被终止之前的状态下重新创建,则应使用您发布的第一个代码块。

FragmentManager 保存它的状态,并在重新创建时恢复它在 Activity 被终止时所持有的片段。它使用片段的已保存状态逐步完成构建生命周期事件:创建、createView、启动、恢复。

我很确定如果您尝试运行第二个代码块,您会在重新启动后发现 FragmentManager 中有两个片段实例——第一次创建活动时添加的片段,以及重启后添加一个。

为了让这一切正常工作,您必须小心地将活动和片段的状态保存在每个的 onSaveInstanceState() 方法中,然后在 onCreate() 测试 savedInstanceState 中,如果不为空,请使用用于恢复活动/片段状态的包。

这是saving/restoring activity state 的指南。更多信息here.

【讨论】:

  • 如果我不想让fragmentmanager在activity被销毁时保留fragments怎么办?
  • 有两种情况:1)activity因为配置改变而被销毁,比如设备轮换2)activity被销毁,整个app进程因为内存压力而被销毁。您希望在两种情况下都丢弃片段还是只丢弃 2)?
  • 跟进我之前的评论:您确定要在销毁活动时丢弃片段吗? Android 多任务设计的意图是,如果一个应用程序由于内存压力而被销毁,然后从主屏幕或最近的任务显示中重新启动,该应用程序处于相同的状态,并且看起来就像它之前一样进入后台。如果您的应用重新启动时看起来不同,您的用户可能会感到困惑。如果你想丢弃片段,因为它有陈旧的数据,可能有更好的方法来做到这一点。
  • @qbix 如果我不希望 fragmentManager 在活动因配置更改而被破坏时保留片段怎么办?
猜你喜欢
  • 1970-01-01
  • 2021-11-29
  • 2019-04-07
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
  • 2019-08-10
  • 1970-01-01
相关资源
最近更新 更多