onSaveInstanceState 的目的

Posted

技术标签:

【中文标题】onSaveInstanceState 的目的【英文标题】:Purpose of onSaveInstanceState 【发布时间】:2012-05-30 20:45:17 【问题描述】:

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

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 的内容,如果我理解正确,那么您实际上无法在会话之间保存数据。那你怎么办呢?

【问题讨论】:

【参考方案1】:

请查看有关 Data Storage 的 Android 文档,了解有关持久数据的选项。您可以使用 Shared Preferences、SQLite 数据库、私有内部目录中的文件或 SD 卡上的文件(如果可用)。

基本上,onSaveInstanceState 用于 Android 终止您的活动以回收内存的场景。在这种情况下,操作系统将记录您的活动是否存在,以防用户返回到它,然后它将BundleonSaveInstanceState 传递给您的onCreate 方法。它不适用于通用存储。

【讨论】:

【参考方案2】:

我会将待办事项放在数据库中,并将数据保存在数据库中的“onPause()”中。您可能需要阅读 Activity lifecycle 以了解活动丢失数据等情况的描述。

this thread 也可能对 onSaveInstanceState 感兴趣。

【讨论】:

【参考方案3】:

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

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

    //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);

【讨论】:

以上是关于onSaveInstanceState 的目的的主要内容,如果未能解决你的问题,请参考以下文章

onSaveInstanceState() 和 onRestoreInstanceState()

android源码解析(二十四)-->onSaveInstanceState执行时机

有关 onSaveInstanceState() 那点事

onSaveInstanceState 没有被调用

分离不触发 onSaveInstanceState() 的片段

如何在 onSaveInstanceState 中使用变量 [重复]