簡體   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