Android面试——Activity生命周期
Google官网其实对Activity做了详细的解释,可以看Activity
下图说明了这些循环以及Activity在状态转变期间可能经过的路径。
矩形表示回调方法,当 Activity 在不同状态之间转变时,可以实现这些方法来执行操作。
下面列出了相同的生命周期回调方法,其中对每一种回调方法做了更详细的描述,并说明了每一种方法在Activity整个生命周期内的位置,包括在回调方法完成后系统能否终止Activity。
/**
* Called when the activity is starting. This is where most initialization
* 首次创建 Activity 时调用。
* 应该在此方法中执行所有正常的静态设置 — 创建视图、将数据绑定到列表等等。
* 系统向此方法传递一个 Bundle 对象,其中包含 Activity 的上一状态,不过前提是捕获了该状态
* 始终后接 onStart()
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* Called after onStop when the current activity is being re-displayed to the user (the user has navigated back to it)
* 在 Activity 已停止并即将再次启动前调用
* 始终后接 onStart()
* ActivityB.onPause → ActivityA.onRestart → ActivityA.onStart → ActivityA.onResume → ActivityB.onStop
*/
@Override
protected void onRestart() {
super.onRestart();
}
/**
* Called after onCreate; or after onRestart when the activity had been stopped, but is now again being displayed to the user.
* 在 Activity 即将对用户可见之前调用。
* 如果 Activity 转入前台,则后接 onResume(),如果 Activity 转入隐藏状态,则后接 onStop()。
*/
@Override
protected void onStart() {
super.onStart();
}
/**
* this is an indicator that the activity became active and ready to receive input. It is on top of an activity stack and visible to user.
* 在 Activity 即将开始与用户进行交互之前调用。 此时,Activity 处于 Activity 堆栈的顶层,并具有用户输入焦点。
* 始终后接 onPause()。
* Activity的View绘制在这里执行,最终绘制到屏幕上和WindowManger关联
* ContentView的performMeasure --> performLayout --> performDraw
*/
@Override
protected void onResume() {
super.onResume();
}
/**
* Called as part of the activity lifecycle when the user no longer actively interacts with the
* activity, but it is still visible on screen
* 当系统即将开始继续另一个 Activity 时调用。
* 此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容,诸如此类。
* 它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行。
* 如果 Activity 返回前台,则后接 onResume(),如果 Activity 转入对用户不可见状态,则后接 onStop()。
*/
@Override
protected void onPause() {
super.onPause();
}
/**
* Called when you are no longer visible to the user
* 在 Activity 对用户不再可见时调用。如果 Activity 被销毁,或另一个 Activity(一个现有 Activity 或新 Activity)继续执行并将其覆盖,就可能发生这种情况。
* 如果 Activity 恢复与用户的交互,则后接 onRestart(),如果 Activity 被销毁,则后接 onDestroy()
*/
@Override
protected void onStop() {
super.onStop();
}
/**
* Perform any final cleanup before an activity is destroyed.
* 在 Activity 被销毁前调用。这是 Activity 将收到的最后调用。
* 当 Activity 结束(有人对 Activity 调用了 finish()),或系统为节省空间而暂时销毁该 Activity 实例时,可能会调用它。
* 可以通过 isFinishing() 方法区分这两种情形。
*/
@Override
protected void onDestroy() {
super.onDestroy();
}
/**
*
* 调用时机不固定:该方法一定是在onStop()方法之前调用, 但是不确定是在onPause()方法之前,还是之后调用;
* 布局中组件状态存储:每个组件都 实现了onSaveInstance()方法, 在调用函数的时候, 会自动保存组件的状态, 注意只有有id的组件才会保存;
* 关于默认的super.onSaveInstanceState(outState):该默认的方法是实现 组件状态保存的;
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
/**
* 在Activity被系统销毁之后 恢复Activity时被调用, 只有销毁了之后重建的时候才调用, 如果内存充足, 系统没有销毁这个Activity, 就不需要调用;
* Bundle对象传递 : 该方法保存的Bundle对象在Activity恢复的时候也会通过参数传递到onCreate()方法中;
*
*/
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
上面描述的是Activity正常情况下的生命周期,这里再结合我们平常使用手机过程中的一些操作,具体说明一下其生命周期过程:
-
初次启动一个Activity,Activity的生命周期:
MainActivity: onCreate MainActivity: onStart MainActivity: onResume
-
从Activity A 打开新的Activity B,B活动回调情况:onPause -> ( Activity B 启动)-> onStop 。
这里还有一种特殊情况,当新启动的Activity采用透明主题时,当前Actvity不会回调onStop方法。
MainActivity: onPause TestActivity: onCreate TestActivity: onStart TestActivity: onResume MainActivity: onStop MainActivity: onSaveInstanceState
-
从A活动切换到B活动,再回到A活动,期间A活动没有调用finish()方法,Activity的生命周期:
TestActivity: onPause MainActivity: onRestart MainActivity: onStart MainActivity: onResume TestActivity: onStop TestActivity: onDestroy
-
按back键退出Activity A,Activity的生命周期
MainActivity: onPause MainActivity: onStop MainActivity: onDestroy
-
息屏,然后亮屏,Activity的生命周期
// 息屏 MainActivity: onPause MainActivity: onStop MainActivity: onSaveInstanceState // 亮屏 MainActivity: onRestart MainActivity: onStart MainActivity: onResume