http://www.2cto.com/kf/201307/227935.html
onCreate() 方法是在 Activity 创建时被系统调用,是一个 Activity 生命周期的开始。 但是参数 Bundle savedInstanceState 很容易被忽略,由于 DialtactsActivity.java 中有涉及,所以整理一下。
在 DialtactsActivity.java 的 onCreate() 方法中有:
if (savedInstanceState == null) {
final PhoneFavoriteFragment phoneFavoriteFragment = new PhoneFavoriteFragment();
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(R.id.dialtacts_frame, phoneFavoriteFragment, TAG_FAVORITES_FRAGMENT);
ft.add(R.id.dialtacts_container, new DialpadFragment(), TAG_DIALPAD_FRAGMENT);
ft.commit();
} else {
mSearchQuery = savedInstanceState.getString(KEY_SEARCH_QUERY);
mInRegularSearch = savedInstanceState.getBoolean(KEY_IN_REGULAR_SEARCH_UI);
mInDialpadSearch = savedInstanceState.getBoolean(KEY_IN_DIALPAD_SEARCH_UI);
mFirstLaunch = savedInstanceState.getBoolean(KEY_FIRST_LAUNCH);
}
就来详细了解下。
1、Bundle
Bundle 数据类型与 Map 数据类型相似,是用来保存实例状态的。而实际上 savedInstanceState 也就是用来保存 Activity 的状态的。就看 savedInstanceState 中的数据是怎么来的。
2、状态保存
当一个 Activity 生命周期结束前,会调用 onSaveInstanceState(Bundle outState) 方法,用来保存 Activity 的状态。
在实际应用中,当一个 Activity 结束前,如果需要保存状态,就在 onSaveInstanceState() 中,将状态数据以 key-value 的形式放入到 onSaveInstanceState() 中。这样,当一个 Activity 被创建时,就能从 onCreate 的参数 savedInstanceState 中获得数据。
状态这个参数在实现应用中有很大的用途,比如:一个游戏在退出前,保存一下当前游戏运行的状态,当下次开启时能接着上次的继续玩下去。再比如:电子书程序,当一本小说被阅读到第199页后退出了(不管是内存不足还是用户自动关闭程序),当下次打开时,读者可能已忘记了上次已阅读到第几页了,但是,读者想接着上次的读下去。如果采用 saveInstallState 参数,就很容易解决上述问题。
还是以 Dialer 的 DialtactsActivity 为例子。
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(KEY_SEARCH_QUERY, mSearchQuery);
outState.putBoolean(KEY_IN_REGULAR_SEARCH_UI, mInRegularSearch);
outState.putBoolean(KEY_IN_DIALPAD_SEARCH_UI, mInDialpadSearch);
outState.putBoolean(KEY_FIRST_LAUNCH, mFirstLaunch);
}