Android面试——Activity生命周期

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正常情况下的生命周期,这里再结合我们平常使用手机过程中的一些操作,具体说明一下其生命周期过程:

  1. 初次启动一个Activity,Activity的生命周期:

    MainActivity: onCreate
    MainActivity: onStart
    MainActivity: onResume
    
  2. 从Activity A 打开新的Activity B,B活动回调情况:onPause -> ( Activity B 启动)-> onStop 。

    这里还有一种特殊情况,当新启动的Activity采用透明主题时,当前Actvity不会回调onStop方法。

    MainActivity: onPause
    TestActivity: onCreate
    TestActivity: onStart
    TestActivity: onResume
    MainActivity: onStop
    MainActivity: onSaveInstanceState
    
  3. 从A活动切换到B活动,再回到A活动,期间A活动没有调用finish()方法,Activity的生命周期:

    TestActivity: onPause
    MainActivity: onRestart
    MainActivity: onStart
    MainActivity: onResume
    TestActivity: onStop
    TestActivity: onDestroy
    
  4. 按back键退出Activity A,Activity的生命周期

    MainActivity: onPause
    MainActivity: onStop
    MainActivity: onDestroy
    
  5. 息屏,然后亮屏,Activity的生命周期

    扫描二维码关注公众号,回复: 9464629 查看本文章
    // 息屏
    MainActivity: onPause
    MainActivity: onStop
    MainActivity: onSaveInstanceState
    
    // 亮屏
    MainActivity: onRestart
    MainActivity: onStart
    MainActivity: onResume
    
发布了29 篇原创文章 · 获赞 3 · 访问量 1129

猜你喜欢

转载自blog.csdn.net/qq_16927853/article/details/102790118