如何在Android中正确保存和恢复活动和片段状态?

时间:2015-05-26 23:38:14

标签: android android-fragments android-activity

在Android中,可以随时销毁Activity和Fragment(例如,如果用户已离开Activity或已调用另一个Activity)。我在Fragment中有一些数据,我想保存它,但是找不到合适的方法。

例如,在Fragment中,我有这段代码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (null != savedInstanceState) 
        initState(savedInstanceState);
    else 
        initStage(getArguments());     
}

private void initState(Bundle bundle) {
    mData = bundle.getParcelable(ARG_DATA);
} 

public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putParcelable(ARG_DATA, mData);
}

在活动中:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_container);

    if (findViewById(R.id.fragment_container) != null) {
        Fragment fragment = getSupportFragmentManager()
            .findFragmentById(R.id.fragment_container);
        if (null == fragment) {
            MyData data = getIntent().getParcelableExtra(ARG_DATA);

            fragment = MyFragment.newInstance(data);
            fragment.setRetainInstance(true);

            getSupportFragmentManager()
                 .beginTransaction()
                 .replace(R.id.fragment_container, fragment)
                 .commit();
        }
    }
}

但是如果托管Activity及其片段将被销毁并再次创建,会发生什么?它会重新创建片段并尝试用旧参数初始化它吗?如何避免这种情况,我是否每次都要将数据传回活动,然后它会被销毁?那么拥有片段有什么意义呢?

由于

更新

为了解释这个问题,我有一个服务工作来保存核心数据。我只需要Activity来显示数据,例如在db中创建一条新记录。但是我最初发现的是,如果Activity被破坏并重新创建,它还将重新创建底层Fragment并使用数据初始化它,坐在Activity参数包中。并且所有用户更改都将丢失。我想要的是,在Fragment创建之后,它将存储用户提交的数据,直到用户点击"提交"按钮并退出活动。因此,即使用户离开活动然后回来,他也不会丢失他已经输入的数据。问题是,我无法在用户输入内容后直接更新记录。这是一个复杂的系统,记录不仅转到本地数据库,服务也会将其发送到服务器,我希望最大限度地减少电话和服务器之间的流量。

1 个答案:

答案 0 :(得分:0)

我在SO Fragment calling fragments loosing state on screen rotation上回答了类似的问题。搜索我的用户名" The Original Android"。

与您的代码相比,示例代码存在差异,即主要活动具有已保存的数据或状态。原因是Fragment数据可能会被破坏,从内存中消失。但是当用户退出应用程序时,主要活动会被破坏,并且应用程序的生命周期通常会终止。因此,在主要活动中存储数据更安全。

修改: 如果您想阅读片段生命周期,那就是@ Fragments

祝你好运,让我们发布......