Android 返回 activity 时 HashMap 不持久化

Android HashMap not persisting when returning to activity

当我导航到另一个 activity 和 return 时,我试图保留我的 HashMap 值。这是我现在的代码。

HashMap 工作并且能够从视图中的 EditText 中获取和保存数据。

然而,一旦我离开 activity 和 return,HashMap 就会重新初始化为空 -> {}

我查看了文档,这似乎是确保持久化可变数据的正确方法。然而它不起作用。

请让我知道可能是什么问题:

public class ScriptActivity extends MainActivity {

    HashMap timeAndMessages;
    EditText message;
    EditText time;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_script);

        if (savedInstanceState != null) {
            timeAndMessages = (HashMap) savedInstanceState.getSerializable("alerts");
        } else {
            timeAndMessages = new HashMap();
        }

        message = (EditText)findViewById(R.id.messageText);
        time = (EditText)findViewById(R.id.timeText);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        restore(savedInstanceState);
    }

    private void restore(Bundle savedInstanceState) {
        if (savedInstanceState != null) {
            timeAndMessages = (HashMap) savedInstanceState.getSerializable("alerts");

        }
    }

    public void createMessage (View view){

        String stringmessage = message.getText().toString();
        int inttime = Integer.parseInt(time.getText().toString());

        timeAndMessages.put(inttime, stringmessage);

        Toast.makeText(getApplicationContext(), "Will display : " + stringmessage + " At time : " + Integer.toString(inttime) , Toast.LENGTH_LONG).show();
    }

    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
        outState.putSerializable("alerts", timeAndMessages);
    }
}

However as soon as I leave from the activity and return, the HashMap is reinitialized to empty -> {}

如果 "leave from the activity and return",你的意思是按下返回按钮,然后做一些事情来重新开始 activity...那么你的行为是符合预期的。

保存实例状态的Bundle主要用于两个场景:

  • 配置更改(例如,用户旋转屏幕)
  • 进程终止,用户 returns 到您最近的任务(例如,通过概览屏幕)

按 BACK 键销毁 activity 两者都不是。因此,状态未保存。

如果此 HashMap 表示模型数据——无论用户如何使用您的应用程序,您都希望能够一次又一次地返回的那种数据——将其保存到数据库中, SharedPreferences,其他类型的文件,或 "the cloud"。

您可以在 the Activity documentation 中阅读有关这些场景的更多信息。