繁体   English   中英

如何在Android中正确保存和还原“活动”和“片段”状态?

[英]How to properly save and restore Activity and Fragment status in Android?

在Android中,可以随时销毁“活动”和“片段”(例如,如果用户已离开“活动”或已调用另一个“活动”)。 我在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及其Fragment再次被破坏并创建,将会发生什么? 它会重新创建Fragment并尝试使用旧参数对其进行初始化吗? 如何避免这种情况,我是否必须每次都将数据传输回Activity,然后数据将被销毁? 那么,拥有片段有什么意义呢?

谢谢

更新。

为了解释这个问题,我有一个服务来将核心数据保留在其中。 我只需要Activity即可显示数据,例如在db中创建新记录。 但是,我最初发现的是,如果Activity被销毁并重新创建,它将也重新创建基础的Fragment并使用Activity参数包中的数据对其进行初始化。 并且所有用户更改都将丢失。 我想要的是在创建Fragment之后,它将存储用户提交的数据,直到用户单击“提交”按钮并退出活动为止。 因此,即使用户离开活动然后返回,他也不会丢失已经输入的数据。 问题是,用户输入内容后,我无法立即更新记录。 这是一个复杂的系统,该记录不仅会转到本地db,该服务还将其发送到服务器,我想最大程度地减少电话和服务器之间的通信量。

我对SO @ Fragment调用了一个类似的问题,它调用了屏幕旋转时片段丢失的状态 搜索我的用户名“ The Original Android”。

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

编辑 :如果您想阅读Fragment生命周期,则为@ Fragments

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM