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

本文详细介绍了Android Activity中的几个重要回调方法,包括onContentChanged、onSaveInstanceState、onRestoreInstanceState、onConfigurationChanged、onPostCreate和onPostResume。这些方法在不同场景下的调用时机及其作用被逐一解析,并给出了具体的应用实例。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值