一、 生命周期
1、Activity与用户交互接口
在Android的系统中,我们是通过Activity任务栈来管理Activity的,一个Activity实例的状态,又决定了它在任务栈的位置,比如上图中处于前台的Activity1,总是位于栈的顶端,当前台的Activity1因为异常或内存不足等原因被销货的时候,处于Activity1下的Activity2会被激活,从而上浮替换掉Activity1。当有新的Activity1被启动的时候,Activity2又会下沉,它就是这样一种通过栈的形式,来不断更改Activity在栈中位置的变化,而它在栈中位置的变化又反应了它在不同状态下的切换。(4种状态下的切换)
2、Activity的4种状态
Active(活动):Activity处于栈顶,可见,能与用户进行交互。
Paused(暂停): 可见但不可以交互。
当Acitivyt被另一个非全屏的Activity挡住的时候,它就会处于Paused状态。Stopped(停止):不可见。
当一个Activity被另一个Activity完全覆盖的时候,它就会处于Stopped状态。Killed(销毁):系统回收掉。
当一个Activity被系统回收掉后,这个Activity就处于Killed状态。
二、Activity生命周期流程图
1、示例代码
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.e("Activity生命周期", "onCreate")
hello.setOnClickListener {
startActivity(Intent(this@MainActivity, MainActivity2::class.java))
}
}
override fun onRestart() {
super.onRestart()
Log.e("Activity生命周期", "onRestart")
}
override fun onStart() {
super.onStart()
Log.e("Activity生命周期", "onStart")
}
override fun onResume() {
super.onResume()
Log.e("Activity生命周期", "onResume")
}
override fun onPause() {
super.onPause()
Log.e("Activity生命周期", "onPause")
}
override fun onStop() {
super.onStop()
Log.e("Activity生命周期", "onStop")
}
override fun onDestroy() {
super.onDestroy()
Log.e("Activity生命周期", "onDestroy")
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
Log.e("Activity生命周期", "onSaveInstanceState")
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
Log.e("Activity生命周期", "onRestoreInstanceState")
}
}
2、正常启动下Activity的生命周期回调方法:
当一个Activity被启动的时候,首先会调用onCreate、onStart、onResume这三个方法;
在onCreate
方法中我们一般会进行变量和数据的初始化工作;
在onStart
时候表示Activity处于可见但不可交互状态;
在onResume
的时候表示Activity处于即可见又可交互状态。在调用完上述三个方法后,Activity就处于正常运行状态中。
如果有一个 新的Activity将要启动 的时候,
当前Activity会调用onPause
方法,这个时候的Activity还是可见状态,但已经不能进行用户交互;如果启动的Activity会 完全覆盖 住当前Activity,
那么就会调用onStop
方法,这个时候Activity是不可见且不能交互的。当Activity被销毁的时候,就会调用
onDestroy
方法。
在onDestroy
方法中我们可以进行数据的释放和销毁的操作。如果 Activity处于onPause状态时被再次激活,
那么它将会调用onResume
方法,让Acitvity再次处于前台可交互状态;如果 Activity处于onStop状态时被再次激活,
那么它会先调用一个onRestart
的方法,然后再调用onStart
,让Activity变的再次可见,而后调用onResume
方法,让Activity可交互。
运行上述代码:
- 启动Activity时,打印日志:
2020-04-13 12:11:59.991 /Activity生命周期: onCreate
2020-04-13 12:11:59.996 /Activity生命周期: onStart
2020-04-13 12:12:00.003 /Activity生命周期: onResume
- 当启动MainActivity2时,打印日志:
2020-04-13 12:23:29.340 /Activity生命周期: onPause
2020-04-13 12:29:39.765 /Activity生命周期: onSaveInstanceState
2020-04-13 12:23:29.869 /Activity生命周期: onStop
- 在MainActivity2页面点击back时,打印日志:
2020-04-13 12:31:48.705 /Activity生命周期: onRestart
2020-04-13 12:31:48.706 /Activity生命周期: onStart
2020-04-13 12:31:48.707 /Activity生命周期: onResume
- 在MainActivity页面点击back时,打印日志:
2020-04-13 12:25:52.551 /Activity生命周期: onPause
2020-04-13 12:25:53.011 /Activity生命周期: onStop
2020-04-13 12:25:53.013 /Activity生命周期: onDestroy
3、Activity异常情况下生命周期分析
-
当Activity发生异常时(系统配置发生改变或内存不足),
会调用onSaveInstanceState
方法,在此方法中我们可以使用bundle进行数据保存。 -
当Activity被重新创建时,
会调用onRestoreInstanceState
进行数据恢复,此方法会将你在onSaveInstanceState
中保存的数据发送给你,也会在onCreate
方法中传递给你onSaveInstanceState
中保存的数据。
一般我们会选取onCreate
或onRestoreInstanceState
中的一个进行数据恢复。
onRestoreInstanceState
只有在页面被异常销毁后重建时会被调用。
当MainActivity发生横竖屏翻转时,打印日志如下:
2020-04-13 12:29:39.764 /Activity生命周期: onPause
2020-04-13 12:29:39.765 /Activity生命周期: onSaveInstanceState
2020-04-13 12:29:39.772 /Activity生命周期: onStop
2020-04-13 12:29:39.774 /Activity生命周期: onDestroy
2020-04-13 12:29:39.851 /Activity生命周期: onCreate
2020-04-13 12:29:39.852 /Activity生命周期: onStart
2020-04-13 12:29:39.853 /Activity生命周期: onRestoreInstanceState
三、 总结
-
Activity正常启动:
onCreate - onStart - onResume
-
点击back回退:
onPause - onStop - onDestroy
-
打开新的Activity:
onPause - onStop
-
Activity异常或打开新Activity:
onSaveInstanceState来保存数据
-
Activity重新创建:
调用onRestoreInstanceState