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 中阅读有关这些场景的更多信息。
当我导航到另一个 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 中阅读有关这些场景的更多信息。