Android
生命周期 - 手册
Activity的生命周期共七个指示器:onCreate
、onStart
、onResume
、onPause
、onStop
、onDestroy
、onRestart
。
如下图所示。
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正在被销毁,也是生命周期最后一个执行的方法,一般我们可以在此方法中做一些回收工作和最终的资源释放。
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()
函数, 而当我们从其他状态切换过来时,依然会调用这两个函数
所以在打开软件后,调用顺序应该是
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
方法执行完成后,新Activity
的onResume
方法才会被执行。所以onPause
不能太耗时,因为这可能会影响到新的Activity的显示。
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
进入多任务界面
由前台进入多任务界面时调用函数如下,所以我们在打开多任务时实际上和点击主页键的函数调用顺序一样.
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
多任务界面进入软件
由多任务界面进入软件的函数调用顺序如下所示
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
然后运行
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
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