Activity的生命周期大家都比较熟,但是Activity还有其他方法,如onContentChanged, onSaveInstanceState, onRestoreInstanceState,onConfigurationChanged ,onPostCreate, onPostResume 。
下面一一介绍:
onContentChanged
onContentChanged()是Activity中的一个回调方法 当Activity的布局改动时,即setContentView()或者addContentView()方法执行完毕时就会调用该方法, 例如,Activity中各种View的findViewById()方法都可以放到该方法中。
onSaveInstanceState
onSaveInstanceState()方法会在什么时候被执行,有这么几种情况:
- 当用户按下HOME键时。
- 长按HOME键,选择运行其他的程序时。
- 按下电源按键(关闭屏幕显示)时。
- 从activity A中启动一个新的activity时。
- 屏幕方向切换时,例如从竖屏切换到横屏时。
总而言之,onSaveInstanceState()的调用遵循一个重要原则,即当系统存在“未经你许可”时销毁了我们的activity的可能时,则onSaveInstanceState()会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。如果调用,调用将发生在onPause()或onStop()方法之前。(虽然测试时发现多数在onPause()前)
还有需要注意的是, onSaveInstanceState()方法并不是一定会被调用的, 因为有些场景是不需要保存状态数据的。 比如用户按下BACK键退出activity时, 用户显然想要关闭这个activity, 此时是没有必要保存数据以供下次恢复的, 也就是onSaveInstanceState()方法不会被调用。
onRestoreInstanceState
onRestoreInstanceState会被调用的场景1:
在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState()一定会被执行,且也一定会执行onRestoreInstanceState()。
onRestoreInstanceState会被调用的场景2:
内存不足,异常退出等情况,会回调该方法。(不好模拟该场景,没有亲自测试)
onRestoreInstanceState()在onStart() 和 onPostCreate(Bundle)之间调用。
onPostCreate,onPostResume
onPostCreate方法是指onCreate方法彻底执行完毕的回调,onPostResume类似,这两个方法官方说法是一般不会重写,现在知道的做法也就只有在使用ActionBarDrawerToggle的使用在onPostCreate需要在屏幕旋转时候等同步下状态,Google官方提供的一些实例就是如下做法:
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
注意的地方:
这个方法默认情况下会自动保存有关Activity的视图层次结构的状态信息,简单举个例子,我们以系统控件EditText来说,系统默认会保存有关这个控件的一个信息,也就是当你在这个控件中输入内容的时候,即使旋转屏幕内容也不会丢失,因为系统已经默认为其实现了我们说的那两个方法,但是有个前提,这个控件必须设置id,否则数据依旧会丢失,另外如果你重写了onRestoreInstanceState也要保证必须有这行代码
super.onRestoreInstanceState(savedInstanceState);
关于旋转屏幕无法调用onSaveInstanceState的问题。
出现这种问题你如果复写的是
public void onSaveInstanceState (Bundle outState, PersistableBundle outPersistentState);
这个方法,是不行的。复写这个方法才可以的:
public void onSaveInstanceState (Bundle outState);
相关博客:
Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceState()