关于android:onSaveInstanceState的目的

Purpose of onSaveInstanceState

我一直在尝试在Android中构建一个任务列表,我希望它能够记住列表中的内容,即使应用程序已关闭。 我一直在尝试使用onSaveInstanceState执行此操作,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Main extends Activity implements OnClickListener, OnKeyListener {
    ...
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ...
        if (savedInstanceState != null) {
            ToDo = savedInstanceState.getStringArrayList("MyArrayList");
            AA.notifyDataSetChanged();
        } else {
            ToDo = new ArrayList<String>(); // Initiate ToDo
        }
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        savedInstanceState.putStringArrayList("MyArrayList", ToDo);
    }
    // ...To-Do implementation follows
}

但这不起作用,所以我开始阅读onSaveInstanceState,如果我理解正确,那么你实际上无法在会话之间保存数据。 那么你怎么能这样做呢?


查看有关数据存储的Android文档,了解保留数据的选项。您可以使用共享首选项,SQLite数据库,专用内部目录中的文件或SD卡上的文件(如果可用)。

基本上,onSaveInstanceState用于Android杀死你的活动以回收内存的场景。在这种情况下,操作系统将记录您的活动的存在,以防用户返回它,然后它会将BundleonSaveInstanceState传递到您的onCreate方法。它并不意味着用于通用存储。


每次销毁和重新创建活动时都会调用onSaveInstanceState(),例如在方向更改期间或设备在低内存上运行时。使用它来保存状态变量并在杀死和重新创建活动时采取适当的操作。

您需要的是SharedPreferences,即使应用程序关闭并重新打开也可以保留数据。看看这个 :

1
2
3
4
5
6
7
8
9
10
11
12
13
    //Initialize the list
    Set<String> valueSet = new HashSet<>();
    valueSet.add("A");
    valueSet.add("B");

    //Saving data in sharedPreferences
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor =  sharedPreferences.edit();
    editor.putStringSet("key_name", valueSet);
    editor.commit();

    //Retrieving saved data from sharedPreferences (even in later sessions)
    valueSet = sharedPreferences.getStringSet("key_name", null);


我会把我的待办事项放在数据库中,然后在'onPause()'中将数据保存在数据库中。当活动松散数据等时,您可能希望阅读活动生命周期以获取描述。

关于onSaveInstanceState,这个线程也可能是有意义的。