文章目录
  1. 1. 生命周期
    1. 1.1. 保存时机
  2. 2. 环境变化

生命周期

Acitivity生命周期
需要清除的,上图虽然在onPause后能结束Activity,但是这在3.0版本后,需要onStop后才能结束Activity

当一个AcitivityA启动另外一个AcitivityB时候,流程如下

1
2
3
4
5
A.onPause()
B.onCreate()
B.onStart()
B.onResume()
A.onStop()

这也暗示了如果B要使用A保存的信息,那么A保存信息的时机必须是onPause而不是onStop,而且注意其中微妙之处:B先Resume之后A才onStop
比较符合人类记忆的是 A失去交互之后,B迅速提高自己到交互,然后A才开始做后续操作

保存时机

界面信息的保存可以利用onSaveInstanceState()方法保存,然后在onRestoreInstanceState()或者onCreate()方法中还原。(启动应用第一次onCreate是不会传入Bundle的,可以用此进行null的判断来确定是不是第一次启动)
onSaveInstanceState(),onRestoreInstanceState()的执行时如下

1
2
3
Resumed
onSaveInstanceState()
Destoryed

1
2
3
onCreate
onRestoreInstanceState()
Resumed

但是onSaveInstanceState()与onRestoreInstanceState()这一对方法只使用与对临时的状态信息的保持,对于需要持续化的信息,就必须在onPause或者onStop中提交保存,不能放在InstanceState相关的回调中,这是因为我们并不能确定InstanceState的回调时机。对于持续化信息,在3.0以前,onStop不能保证会被回调,只保证onPause被回调,但是3.0以后同时保证了onPause与onStop被回调,官方推荐在onPause中做轻量级的保存,在onStop中做重量级的保存。

环境变化

当语言环境,横竖屏等环境等变化时候,Activity会重新re-Create, 并且这是一个全新的实例。系统之所以这么做是为了让所有的Resource重新转载一遍。一般情况下,按照默认这种情况不会出现问题,但是当Activity的re-Create过程消耗太多资源时,我们就必须考虑优化方式了:

  1. RetainInstaceFragment: 设置Fragment为retainInstance,并添加get,set方法。
  2. 自己处理环境变换不让系统处理:Activity添加android:configChanges(横竖屏是:orientation|keyboardHidden,3.2以上还要screenSize),回调onConfigurationChanged
文章目录
  1. 1. 生命周期
    1. 1.1. 保存时机
  2. 2. 环境变化