Android生命周期初探

Android生命周期 - 手册

Activity的生命周期共七个指示器:onCreateonStartonResumeonPauseonStoponDestroyonRestart

如下图所示。

onCreate: 不可见状态

在Activity被创建时回调,第一个生命周期。我们一般在创建Activity时需要重写该方法做一些初始化的操作,如通过setContentView设置界面布局的资源,初始化所需要的组件信息等。

onStart: 可见状态

该方法回调表示Activity正在启动,此时Activity处于可见状态,只是还没有在前台显示,因此用户也无法交互。可以简单理解为Activity已显示却无法被用户看见。

onResume: 可见状态

此方法回调时,Activity已在在屏幕上显示UI并允许用户操作了。从流程图可见,当Activity停止后(onPause、onStop方法被调用),重新回到前台时也会调用onResume方法。可以在onResume方法中初始化一些资源,比如打开相机或开启动画。

onPause: 可见状态

此方法回调时,Activity正在停止(Paused形态),通常接下来 onStop() 会被回调 。但通过流程图可见,另一种情况是onPause() 执行后直接执行了onResume方法,这可能是用户点击Home键,让程序退回到主界面,程序在后台运行时又迅速地再回到到当前的Activity,此时onResume方法就会被回调。我们可以在onPause方法中做一些数据存储、动画停止、资源回收等操作。另外,onPause方法执行完成后,新Activity的onResume方法才会被执行。所以onPause不能太耗时,因为这可能会影响到新的Activity的显示。

onStop: 不可见状态

此方法回调时,Activity即将停止或者完全被覆盖(Stopped形态),此时Activity不可见,仅在后台运行。同样地,在onStop方法可以做一些资源释放的操作,不能太耗时。

onRestart: 可见状态

此方法回调时,表示Activity正在重新启动,由不可见状态变为可见状态。这种情况,一般发生在用户打开了一个新的Activity时,之前的Activity就会被onStop,接着又回到之前Activity页面时,之前的Activity的 onRestart方法就会被回调。

onDestroy() ,不可见状态

此方法回调时,表示Activity正在被销毁,也是生命周期最后一个执行的方法,一般我们可以在此方法中做一些回收工作和最终的资源释放。

Android生命周期初探

AndroidStudio测试

因初学Android, 对生命周期的理解还是不是太深, 不太明白什么动作会回调, 所以我将使用AndroidStudio模拟用户各种操作, 探究操作对应的回调函数.

在这之前, 我们在MainActicity文件中重写各种周期函数 ,所以我们先在其中添加如下代码

private const val TGA ="MainActivity"
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activi)
    }

    override fun onStart() {
        super.onStart()
        Log.d(TGA,"onStart called")
    }

    override fun onResume() {
        super.onResume()
        Log.d(TGA,"onResume called")
    }

    override fun onPause() {
        super.onPause()
        Log.d(TGA,"onPause called")
    }

    override fun onStop() {
        super.onStop()
        Log.d(TGA,"onStop called")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d(TGA,"onDestroy called")
    }
}

Log将在对应函数调用时打印出对应的内容,第一个参数我们一般传如类名,第二个参数就是在调用时显示的信息

创建应用并运行

点击运行按钮, 软件自动创建虚拟机并自动创建软件运行, Logcat控制台打印出了以下消息

2021-10-22 13:13:09.562 4294-4294/com.kotlin.book D/MainActivity: onStart called
2021-10-22 13:13:09.564 4294-4294/com.kotlin.book D/MainActivity: onResume called

说明打开应用时首先调用了onStart()onResume()函数, emm, 但是开始不是应该调用onCreate()函数的吗?所以我紧接着删除了虚拟机上的软件, 重新构建APP尝试看看. 很遗憾, 不管是虚拟机还是实体机, 每次都是先调用的onStart()onResume()函数, 并没有调用onCreate()函数, 希望哪位大佬可以在评论下指出

所以应该是除了第一次创建时会调用onCreate()函数,其他时候会调用onStart()onResume()函数

前台运行

单纯的前台运行时没有任何调用调用, 依然是前面创建时的onStart()onResume()函数, 而当我们从其他状态切换过来时,依然会调用这两个函数

所以在打开软件后,调用顺序应该是

打开软件 onStart onResume Activity已显示却无法被用户看见 Activity已在在屏幕上显示并允许用户操作
2021-10-22 13:43:02.352 15023-15023/com.kotlin.book D/MainActivity: onStart called
2021-10-22 13:43:02.353 15023-15023/com.kotlin.book D/MainActivity: onResume called

由前台进入后台(点击主页键后)

点击主页键后我门可以首先看到调用了onPause()函数, 是软件进入了暂停状态. 紧接着就调用了onStop()函数.一般来说顺序确实是这样,但通过流程图可见,另一种情况是onPause()执行后直接执行了onResume方法,这可能是用户点击Home键,让程序退回到主界面,程序在后台运行时又迅速地再回到到当前的Activity,此时onResume方法就会被回调。我们可以在onPause方法中做一些数据存储、动画停止、资源回收等操作。另外,onPause方法执行完成后,新ActivityonResume方法才会被执行。所以onPause不能太耗时,因为这可能会影响到新的Activity的显示。

一般情况 后台Activity就是当前Activitiy 点击主页键 onPause onStop onResume
2021-10-22 13:48:45.062 19444-19444/com.kotlin.book D/MainActivity: onPause called
2021-10-22 13:48:45.092 19444-19444/com.kotlin.book D/MainActivity: onStop called

进入多任务界面

由前台进入多任务界面时调用函数如下,所以我们在打开多任务时实际上和点击主页键的函数调用顺序一样.

点击多任务 onPause onStop
2021-10-22 13:55:31.006 22169-22169/com.kotlin.book D/MainActivity: onPause called
2021-10-22 13:55:31.063 22169-22169/com.kotlin.book D/MainActivity: onStop called

多任务界面进入软件

由多任务界面进入软件的函数调用顺序如下所示

多任务进入软件 onStart onResume Activity已显示却无法被用户看见 Activity已在在屏幕上显示并允许用户操作
2021-10-22 14:02:31.611 23183-23183/com.kotlin.book D/MainActivity: onStart called
2021-10-22 14:02:31.613 23183-23183/com.kotlin.book D/MainActivity: onResume called

可以看到和我们进入主页再点击进入软件的调用顺序一样.

分屏创建

这次终于发生了一些不一样的地方,我们在创建分屏后, 首先销毁了当前的活动, 创建了一个新的活动,然后加载UI, 然后出现选择其他软件的画面,在这个过程中,状态一直都是暂停状态,在选择了其他软件后, 选择了继续加载UI然后运行

点击创建小窗 onDestroy onStart onResume onPause 点击创建小窗 销毁当前活动 创建新的活动 加载UI 等待打开其他软件
2021-10-22 14:09:49.329 24199-24199/com.kotlin.book D/MainActivity: onDestroy called
2021-10-22 14:09:49.439 24199-24199/com.kotlin.book D/MainActivity: onStart called
2021-10-22 14:09:49.441 24199-24199/com.kotlin.book D/MainActivity: onResume called
2021-10-22 14:09:49.587 24199-24199/com.kotlin.book D/MainActivity: onPause called
2021-10-22 14:09:51.385 24199-24199/com.kotlin.book D/MainActivity: onResume called

旋转操作

这次和上面加载小窗有相似的地方,我们在创建旋转后, 首先暂停和停止了当前的活动, 便于资源回收等 , 然后销毁了当前的活动, 创建了一个新的活动,然后加载UI

旋转窗口哦 onPause onStop onDestroy onStart onResume
2021-10-22 14:18:52.780 24812-24812/com.kotlin.book D/MainActivity: onPause called
2021-10-22 14:18:52.781 24812-24812/com.kotlin.book D/MainActivity: onStop called
2021-10-22 14:18:52.783 24812-24812/com.kotlin.book D/MainActivity: onDestroy called
2021-10-22 14:18:52.903 24812-24812/com.kotlin.book D/MainActivity: onStart called
2021-10-22 14:18:52.905 24812-24812/com.kotlin.book D/MainActivity: onResume called
上一篇:Android 开发必备知识点及面试题汇总(Android+Java+算法+性能优化+四大组件……)


下一篇:Activity的6大难点你会几个,2021Android常见面试题