Activity作为Android的四大组件之一,非常的重要,也是最常用的四大组件,使用Activity必须要在AndroidManifest中进行注册,那么作为Android的基础,Activity的生命周期你是否完全掌握了呢?下面就让我们来一起回顾一下Activity的生命周期吧!
首先,你需要知道 Activity的生命周期分为两种。
所以我们先来介绍前者,因为后者出现的情况比较特殊。
先总结一下有什么生命周期回调方法以及各个生命周期回调方法都是代表什么意思。
onRestart 方法
,如果 Activity 被销毁,则会调用onDestroy方法。代码验证:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LogUtils.d(TAG,"onCreate ---> 创建时调用");
}
@Override
protected void onRestart() {
super.onRestart();
LogUtils.d(TAG,"onRestart ---> 重启时调用");
}
@Override
protected void onStart() {
super.onStart();
LogUtils.d(TAG,"onStart ---> 即将可见不可交互时调用");
}
@Override
protected void onResume() {
super.onResume();
LogUtils.d(TAG,"onResume ---> 可见可交互时调用");
}
@Override
protected void onPause() {
super.onPause();
LogUtils.d(TAG,"onPause ---> 即将暂停时调用");
}
@Override
protected void onStop() {
super.onStop();
LogUtils.d(TAG,"onStop ---> 即将停止不可见时调用");
}
@Override
protected void onDestroy() {
super.onDestroy();
LogUtils.d(TAG,"onDestroy ---> 即将销毁时调用");
}
1.正常进入Activity的生命周期log日志。
V/MAIN_ACTIVITY: onCreate ---> 创建时调用
V/MAIN_ACTIVITY: onStart ---> 即将可见不可交互时调用
V/MAIN_ACTIVITY: onResume ---> 可见可交互时调用
2.点击物理返回键正常退出Activity的生命周期log日志。(长按home键退出应用不走onDestroy回调方法,但是会走onSaveInstanceState方法,后面会讲)
V/MAIN_ACTIVITY: onPause ---> 即将暂停时调用
V/MAIN_ACTIVITY: onStop ---> 即将停止不可见时调用
V/MAIN_ACTIVITY: onDestroy ---> 即将销毁时调用
3.正常进入Activity,点击home键返回手机主界面的生命周期log日志。
V/MAIN_ACTIVITY: onCreate_A ---> 创建时调用
V/MAIN_ACTIVITY: onStart_A ---> 即将可见不可交互时调用
V/MAIN_ACTIVITY: onResume_A ---> 可见可交互时调用
V/MAIN_ACTIVITY: onPause_A ---> 即将暂停时调用
V/MAIN_ACTIVITY: onStop_A ---> 即将停止不可见时调用
4.长按home键再次回到 Activity 的生命周期log日志。
V/MAIN_ACTIVITY: onRestart_A ---> 重启时调用
V/MAIN_ACTIVITY: onStart_A ---> 即将可见不可交互时调用
V/MAIN_ACTIVITY: onResume_A ---> 可见可交互时调用
5.正常进入Activity_A,启动另一个Activity_B 的生命周期log日志。
V/MAIN_ACTIVITY: onCreate_A ---> 创建时调用
V/MAIN_ACTIVITY: onStart_A ---> 即将可见不可交互时调用
V/MAIN_ACTIVITY: onResume_A ---> 可见可交互时调用
V/MAIN_ACTIVITY: onPause_A ---> 即将暂停时调用
V/MAIN_ACTIVITY: onCreate_B ---> 创建时调用
V/MAIN_ACTIVITY: onStart_B ---> 即将可见不可交互时调用
V/MAIN_ACTIVITY: onResume_B ---> 可见可交互时调用
V/MAIN_ACTIVITY: onStop_A ---> 即将停止不可见时调用
6.按下物理返回键再次回到Activity_A的生命周期log日志。
V/MAIN_ACTIVITY: onPause_B ---> 即将暂停时调用
V/MAIN_ACTIVITY: onRestart_A ---> 重启时调用
V/MAIN_ACTIVITY: onStart_A ---> 即将可见不可交互时调用
V/MAIN_ACTIVITY: onResume_A ---> 可见可交互时调用
V/MAIN_ACTIVITY: onStop_B ---> 即将停止不可见时调用
V/MAIN_ACTIVITY: onDestroy_B ---> 即将销毁时调用
总结:可以清晰地看到,Avtivity的整个生命周期是发生在 onCreate 方法 和 onDestroy 方法之间的。其中可见生命周期是发生onStart 方法和 onStop 方法之间的,也就是用户可以在界面看到Activity并且可以交互的状态。前台生命周期是发生在onResume 方法和 onPause 方法之间的,这个状态下Activity位于所有的Activity之上,并且可以和用户交互。
备注:因为如果跳转下一个Activity时系统会先调用上一个Activity的onPause方法,所以一定不能在onPause方法中进行耗时操作!
先总结一下有什么生命周期回调方法以及各个生命周期回调方法都是代表什么意思。
1.onSaveInstanceState:当系统为了恢复内存而销毁某项 Activity 时,Activity 对象也会被销毁,因此系统在继续 Activity 时根本无法让其状态保持完好,而是必须在用户返回 Activity 时重建 Activity 对象。但用户并不知道系统销毁 Activity 后又对其进行了重建,因此他们很可能认为 Activity 状态毫无变化。 在这种情况下,你可以实现onSaveInstanceState回调方法对有关 Activity 状态的信息进行保存,以确保有关 Activity 状态的重要信息得到保留。
调用时机:当用户按下HOME键时、长按HOME键,选择运行其他的程序时、按下电源按键(关闭屏幕显示)时、从activity A中启动一个新的activity时、屏幕方向切换时,例如从竖屏切换到横屏时。
2.onRestoreInstanceState 或者 onCreate:系统会先调用onSaveInstanceState方法,然后销毁 Activity。系统会向该方法传递一个Bundle 对象,你可以在其中使用putString 和 putInt 等方法以键-值对形式保存有关 Activity 状态的信息。然后,如果系统终止您的应用进程,并且用户返回您的 Activity,则系统会重建该 Activity,并将Bundle同时传递给onCreate和onRestoreInstanceState。您可以使用上述任一方法从Bundle 提取您保存的状态并恢复该 Activity 状态。如果没有状态信息需要恢复,则传递给您的Bundle是空值(如果是首次创建该 Activity,就会出现这种情况)。
解析流程图:可以看到,从Activity running开始走,Activity 重获用户焦点时可保持状态完好。恢复数据的方式跟随生命周期的不同有两种情况。
代码验证:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (outState != null){
outState.putString("TEST","test");
LogUtils.d(TAG2,"onSaveInstanceState ---> 异常销毁时调用");
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState != null){
String test = savedInstanceState.getString("TEST");
LogUtils.d(TAG2,"onRestoreInstanceState ---> 恢复数据时调用 --> " + test);
}
}
1.旋转手机屏幕查看log日志。
V/MAIN_ACTIVITY2: onSaveInstanceState ---> 异常销毁时调用
V/MAIN_ACTIVITY2: onRestoreInstanceState ---> 恢复数据时调用 --> test
总结:注意:onSaveInstanceState的调用时序在onStop之前,但是和onPause 的调用时序就不一定了,有可能在onPause之前或者之后。又因为无法保证系统会调用onSaveInstanceState(存在不需要保存状态的情况,例如用户使用“返回”按钮离开您的 Activity 时,因为用户的行为是在显式关闭 Activity),因此您只应利用它来记录 Activity 的瞬态(UI 的状态)切勿使用它来存储持久性数据,而应使用onPause在用户离开 Activity 后存储持久性数据,例如应保存到数据库的数据。
备注:
欢迎加入Q群一起探讨Android问题。