作为Android开发人,如果说连Activity生命周期都没搞懂,会走非常多的弯路,所以这篇文章我就对Activity生命周期的生命周期进行一个简单的总结。
单Activity生命周期的整体流程
首先,我们创建一个My_A_Activity,并且打印它的各个生命周期方法。
class My_A_Activity : AppCompatActivity() {
private val TAG = "My_A_Activity"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my_act)
Log.i(TAG,"onCreate")
}
override fun onRestart() {
super.onRestart()
Log.i(TAG, "onRestart")
}
override fun onStart() {
super.onStart()
Log.i(TAG, "onStart")
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
Log.i(TAG, "onRestoreInstanceState")
}
override fun onResume() {
super.onResume()
Log.i(TAG, "onResume")
}
override fun onPause() {
super.onPause()
Log.i(TAG, "onPause")
}
override fun onStop() {
super.onStop()
Log.i(TAG, "onStop")
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
Log.i(TAG, "onSaveInstanceState")
}
override fun onDestroy() {
super.onDestroy()
Log.i(TAG, "onDestroy")
}
}
现在,我们开始来走一遍单个Activity的生命周期吧!
启动My_A_Activity,日志打印如下:
My_A_Activity: onCreate
My_A_Activity: onStart
My_A_Activity: onResume
如果按下home键,日志打印如下:
My_A_Activity: onPause
My_A_Activity: onStop
My_A_Activity: onSaveInstanceState
如果此时再次点击图标进入,日志打印如下:
My_A_Activity: onRestart
My_A_Activity: onStart
My_A_Activity: onResume
此时,进行横竖屏切换,日志打印如下:
My_A_Activity: onPause
My_A_Activity: onStop
My_A_Activity: onSaveInstanceState
My_A_Activity: onDestroy
My_A_Activity: onCreate
My_A_Activity: onStart
My_A_Activity: onRestoreInstanceState
My_A_Activity: onResume
此时,退出app,日志打印如下:
My_A_Activity: onPause
My_A_Activity: onStop
My_A_Activity: onDestroy
以上流程还是很简单的,但是有一个生命周期比较特殊,那就是横竖屏切换的时候,在进行横竖屏切换时,Activity执行了:
onPause -> onStop -> onSaveInstanceState -> onDestroy
方法后又执行了:
onCreate -> onStart -> onRestoreInstanceState -> onResume,说明Activity被销毁并重建了。
这里需要注意一个点,如果Activity的configChanges属性配置了orientation时,横竖屏切换是不会走任何生命周期方法的,配置如下:
<activity
android:name=".My_A_Activity"
android:configChanges="orientation" />
那么还有一个问题,这个onSaveInstanceState
和onRestoreInstanceState
是什么方法呢?
其实,它们都不是Activity生命周期的方法,但是有必要知道它们的调用时机,所以这里对它们进行简单的介绍一下:
onSaveInstanceState
onSaveInstanceState(outState: Bundle)
:在某种时机下,Activity会调用onSaveInstanceState方法通过保存Bundle参数来保存当前的Activity的数据。
onSaveInstanceState(outState: Bundle)
方法会在什么时机被调用呢?
有以下几种情况:
- 按下HOME键切到后台时
- 锁屏时(按下电源键或自动锁屏)
- 从该Activity中启动一个新的Activity时
- 横竖屏切换时 (前提是Activity的configChanges属性配置了orientation)
注意,onSaveInstanceState方法总是会在onStop后调用。
onRestoreInstanceState
onRestoreInstanceState(savedInstanceState: Bundle)
:当Activity被重新创建(横竖屏切换,或者被系统强杀重启后的重新创建)之后就会调用onRestoreInstanceState,而它的Bundle参数,就是onSaveInstanceState方法保存的。onRestoreInstanceState这个方法会在onStart后调用。
onRestoreInstanceState(savedInstanceState: Bundle)
方法会在什么时机被调用呢?
有以下几种情况:
- Activity在后台的情况下,被系统强杀了,再次打开Activity时
- 横竖屏切换时 (前提是Activity的configChanges属性配置了orientation)
注意,onRestoreInstanceState这个方法会在onStart后调用。
多Acitivity跳转的生命周期
我们在新建一个Activity,名字就叫My_B_Activity吧,跟My_A_Activity一样,我们直接打印它的各个生命周期方法,另外,在MainActivtiy中加上一个按钮,用于跳转到My_B_Activity。代码很简单,就不贴了。
当打开MainActivtiy,日志打印如下:
My_A_Activity: onCreate
My_A_Activity: onStart
My_A_Activity: onResume
点击按钮跳转到 My_B_Activity ,日志打印如下:
My_A_Activity: onPause
My_B_Activity: onCreate
My_B_Activity: onStart
My_B_Activity: onResume
My_A_Activity: onStop
My_A_Activity: onSaveInstanceState
可以看到,先执行了 My_A_Activity 的 onPause 方法,
然后继续执行了 My_B_Activity 的 onCreate -> onStart -> onResume
然后才执行了 My_A_Activity 的 onStop -> onSaveInstanceState
这个点要注意一下,比较关键!
好,我们继续走,销毁 My_B_Activity ,日志打印如下:
My_B_Activity: onPause
My_A_Activity: onRestart
My_A_Activity: onStart
My_A_Activity: onResume
My_B_Activity: onStop
My_B_Activity: onDestroy
可以看到,先执行了 My_B_Activity 的 onPause 方法,
然后继续执行了 My_A_Activity 的 onRestart -> onStart -> onResume
然后才执行了 My_B_Activity 的 onStop -> onDestroy
这里也是关键,需要注意!
好,我们继续走,销毁 My_A_Activity ,日志打印如下:
My_A_Activity: onPause
My_A_Activity: onStop
My_A_Activity: onDestroy
至此,本篇结束,其实Activity的生命周期相关的知识点已经讲得差不多了,再多的也什么可将的了,只要你懂得了以上的知识点,应付日常的开发应该已经是够了。
标签:onResume,生命周期,onStart,onStop,Activity,搞懂,onSaveInstanceState,My From: https://blog.51cto.com/u_16163453/6534778