注意,当系统因为内存不足(优先级更高的应用需要内存,请看上图红框)要回收Activity占用的资源时,Activity在执行完onPause()方法后就会被销毁,有些生命周期方法onStop(),onDestory()就不会执行。当再回到此Activity时,是从onCreate方法开始执行
生命周期
- onCreate
- 表示activity正在被创建
- 初始化工作:setContentView、初始化Activity需要的数据
- onRestart
- 表示重新创建
- Activity从不可见重新变为可见才会调用
- 一般是用户所致,如按下home键
- onStart
- 正在启动
- Activity在后台—已经可见但是没出现在前台、无法和用户交互
- 可以理解为Activity已经显示出来,但是我们看不到
- onResume
- 已经可见,并且在前台开始活动
- onPause
- 表示Activity正在停止
- 可以做一些存储数据、停止动画等
- 注意不能太耗时,会影响新Activity的显示—onPause必须执行完,新的Activity onResume才会执行
- onStop
- 表示Activity即将停止
- 可以做一些稍微重量级的回收工作,同样不能太耗时
- onDestroy
- 表示Activity即将被销毁
- 回收工作和最终的资源释放
onStart和onStop是从Activity是否可见这个角度来回调的,而onResume和onPause是从Activity是否位于前台这个角度来回调的,除了这种区别,在实际使用中没有其他明显区别
生命周期切换过程
- 针对一个特定的Activity,第一次启动,回调如下:onCreate>onStart>onResume
- 打开新的Activity或者切换到桌面的时候,回调如下:onPause>onStop。
- 特殊情况:如果新Activity采用了透明主题,那么当前Activity不会回调onStop
- 当用户再次回到原Activity时,回调如下:onRestart>onStart>onResume
- 当用户按back键回退时,回调如下:onPause>onStop>onDestroy
- pair
- onCreate和onDestroy, 标识Activity的创建和销毁
- 是否可见:onStart和onStop, 随着用户操作和设备屏幕点亮和熄灭,可能调用多次
- 是否在前台: onResume和onPause, 随着用户操作和设备屏幕点亮和熄灭,可能调用多次
Activity异常结束
- 时机
- 系统回收Activity
- 设备的Configuration改变导致Activity销毁重建
- 必须设置为android:configChanges=”orientation|screenSize”时,不会重走生命周期
- 只会回调onConfigurationChanged方法
- 必须设置为android:configChanges=”orientation|screenSize”时,不会重走生命周期
- 流程
- onStop之前回调onSaveInstanceState保存数据
- 在onStart之后回调onRestoreInstanceState
- 其中Bundle数据会传到onCreate(不一定有数据)和onRestoreInstanceState(一定有数据)
/**
* saveInstance 不一定有数据
* @param saveInstance
*/
@Override
protected void onCreate(Bundle saveInstance) {
super.onCreate(saveInstance);
// Check whether we're recreating a previously destroyed instance
if (saveInstance != null) {
// Restore value of members from saved state
mUser = saveInstance.getString(STATE_USER);
} else {
// Probably initialize members with default values for a new instance
mUser = "NewUser";
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString(STATE_USER, mUser);
//onStop之前调用
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//不需要判断savedInstanceState, 在onStart后调用
// Restore value of members from saved state
mUser = savedInstanceState.getString(STATE_USER);
}