为什么在onSaveInstanceState()中保存非Parcelable对象的Hashtable有时会起作用?

eri*_*ion 6 android bundle parcelable activity-lifecycle android-activity

在阅读了介绍性的Android编程书之后,我想改变示例应用程序,以巩固我对一些未真正涵盖的主题的理解.在进行更改时,我犯了一个错误,但我很好奇为什么错误在某些情况下有效但在其他情况下却没有.

应用程序中的一个活动在a中存储一系列问题Hashtable<Integer, Question>,其中Question是一个包含int和两个字符串的小类.最初编写时,活动会从服务器上下载每个问题onCreate(),因此我希望实施onSaveInstanceState()以防止一些冗余下载. onSaveInstanceState()使用将Hashtable保存到Bundle中putSerializable().

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
            // mQuestions is a member variable of 
            // type Hashtable<Integer, Question>
    if (mQuestions != null && mQuestions.size() > 0) {
        outState.putSerializable(SAVED_QUESTIONS, mQuestions);
    }
}
Run Code Online (Sandbox Code Playgroud)

即使在我知道Parcelable是什么或如何实现之前,它也能完美地适应屏幕方向的变化.我只知道当我按下模拟器的主页键和应用程序静默时出现问题,无法在没有LogCat输出的情况下崩溃.堆栈跟踪让我查找Parcelable并使Question实现它.

我的问题不是我做错了什么.问题是:当Question类没有实现Parcelable时,为什么应用程序只在按Home而不是屏幕方向更改时崩溃?

She*_*tib 1

引用史蒂夫·莫斯利的话

请注意,根据http://developer.android.com/reference/android/app/Activity.html中有关活动状态的文档,使用和是不安全的。onSaveInstanceStateonRestoreInstanceState

该文件指出(在“活动生命周期”部分):

请注意,重要的是保存持久数据而onPause()不是onSaveInstanceState(Bundle) 后者不是生命周期回调的一部分,因此不会在其文档中描述的每种情况下都被调用。

换句话说,将您的保存/恢复代码放入onPause()其中onResume()即可!