四大组件之activity(你所不太关注的方法)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/da_caoyuan/article/details/78902978

Activity的生命周期大家都比较熟,但是Activity还有其他方法,如onContentChanged, onSaveInstanceState, onRestoreInstanceState,onConfigurationChanged ,onPostCreate, onPostResume 。

下面一一介绍:

onContentChanged

onContentChanged()是Activity中的一个回调方法 当Activity的布局改动时,即setContentView()或者addContentView()方法执行完毕时就会调用该方法, 例如,Activity中各种View的findViewById()方法都可以放到该方法中。

onSaveInstanceState

onSaveInstanceState()方法会在什么时候被执行,有这么几种情况:

  1. 当用户按下HOME键时。
  2. 长按HOME键,选择运行其他的程序时。
  3. 按下电源按键(关闭屏幕显示)时。
  4. 从activity A中启动一个新的activity时。
  5. 屏幕方向切换时,例如从竖屏切换到横屏时。

总而言之,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()

安卓开发41:状态保存 Bundle savedInstanceState

猜你喜欢

转载自blog.csdn.net/da_caoyuan/article/details/78902978