Android面试官:我在Activity onResume()之前的任何一个生命周期中调用了finish()后,此Activity的生命周期会如何?

作者:Android王小波
链接:https://juejin.cn/post/7038903088039591943

一、前言:

在Android开发中,Activity是四大组件中最重要的组件,然而Activity的生命周期又是其中最为基础的知识点,所以重要性不言而喻。我刚接触Android不足两年,之前也恶补了生命周期相关的知识,起初自认为了解的比较全面了,直到我被问到了上面的问题,然后我彻底懵了。我面试了许多家公司,大厂小厂都有面试,小厂没有被问到,大厂面试中,第一次是B站有问到我这个问题,我没答上,不出意外的挂了。第二次就是被携程问到,有了第一次失败的总结,所以我就自己直接上代码实践了下,结果完美通过。接下来我就对生命周期中这一个细节做个总结,希望对各位有所帮助。

二、Activity生命周期

关于Activity生命周期我这里就做简单介绍,相关的详细文章很多,这不是我的重点。在正常情况下,一个Activity会经历这么一个生命周期:onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy(). 我们可以直接通过代码跑一下看看:

1. 代码示例

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("MainActivity", "onCreate");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d("MainActivity", "onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("MainActivity", "onResume");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d("MainActivity", "onRestart");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d("MainActivity", "onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d("MainActivity", "onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("MainActivity", "onDestroy");
    }
}

不出意外,结果就是如下所示,大家可以自己试一下:

com.example.lifecycle D/MainActivity: onCreate
com.example.lifecycle D/MainActivity: onStart
com.example.lifecycle D/MainActivity: onResume
com.example.lifecycle D/MainActivity: onPause
com.example.lifecycle D/MainActivity: onStop
com.example.lifecycle D/MainActivity: onDestroy

2. 各生命周期回调方法介绍

接下来我简单介绍下在各个生命周期中都干了什么事情:

(1) onCreate: 表示Activity正在被创建,是生命周期的第一个方法。此方法中主要是做了一些初始化的工作,例如调用setContentView加载布局资源、初始化Activity所需数据(intent等)。

(2) onRestart: 表示Activity被重新启动,通常为当Activity由不可见重新变为可见时,该方法就会被调用。例如用户按下Home键切换到桌面后接着再返回到这个Activity时,就会被调用。

(3) onStart: 表示Activity正在被启动,此时Activity已经可见,但还没出现在前台,无法和用户进行交互,通俗理解就是Activity已经被绘制出来了,只是我们还看不到。

(4) onResume: 表示Activity处于可见状态,并且已经可以在前台活动了。注意!!!这里又有一个面试常见提问点,onStart和onResume都表示Activity已经可见,但是onStart时Activity还在后台,只有当onResume时Activity才显示到前台,请注意区分。

(5) onPause: 表示Activity正在停止,此时可以做一些不太耗时的收尾工作,例如存储数据、停止动画等工作。

(6) onStop: 表示Activity即将停止,此时可以做一些相对于onPause而言比较重量级的回收工作,当然同样不能太耗时。

(7) onDestroy:表示Activity即将被销毁,这是生命周期中最后一个方法,此时我们可以做一些回收工作和最终的资源释放。

正常流程就是上面说的(onRestart可能不会被执行)

3. 回归标题中的问题

(1) 在onCreate中调用finish():

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d("MainActivity", "onCreate");
    finish();
}

输出结果为:

2021-12-07 17:53:00.685 23747-23747/com.example.lifecycle D/MainActivity: onCreate
2021-12-07 17:53:00.985 23747-23747/com.example.lifecycle D/MainActivity: onDestroy

(2) 在onStart中调用finish()的结果为:

2021-12-07 17:57:04.408 23992-23992/com.example.lifecycle D/MainActivity: onCreate
2021-12-07 17:57:04.410 23992-23992/com.example.lifecycle D/MainActivity: onStart
2021-12-07 17:57:04.773 23992-23992/com.example.lifecycle D/MainActivity: onStop
2021-12-07 17:57:04.783 23992-23992/com.example.lifecycle D/MainActivity: onDestroy

(3) 在onResume中调用finish()的结果为:

2021-12-07 17:58:34.327 24128-24128/com.example.lifecycle D/MainActivity: onCreate
2021-12-07 17:58:34.344 24128-24128/com.example.lifecycle D/MainActivity: onStart
2021-12-07 17:58:34.368 24128-24128/com.example.lifecycle D/MainActivity: onResume
2021-12-07 17:58:34.391 24128-24128/com.example.lifecycle D/MainActivity: onPause
2021-12-07 17:58:34.572 24128-24128/com.example.lifecycle D/MainActivity: onStop
2021-12-07 17:58:34.583 24128-24128/com.example.lifecycle D/MainActivity: onDestroy

不知各位看出什么现象没有,各位可以自行观察下其中有什么规律,我会在最后的总结中告知大家。

三、总结

从控制台输出的log中可以看出,这些生命周期是成双成对,相辅相成存在的,就像onCreate和onDestroy分别表示Activity的创建和销毁,并且只有可能调用一次。 然而从Activity是否可见来说onStart和onStop是配对的,他们会随用户的操作可能被调用多次。从Activity是否在前台来说onResume和onPause是配对的,同样的他们会随用户的操作可能被调用多次.当其中一者被调用后,那么与之对应另一个在结束时也一定会被调用。 好了这些就是我的面试踩坑经验,希望对大家有所帮助,祝大家早日涨薪!

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>