Activity状态和生命周期

当用户在进入或退出我们的app时,在activity的生命周期内,activity的状态会随着用户的操作而变化。

1. Activity的状态

activity的六种状态: created, started, resumed, paused, stopped, destoryed。

activity提供了一系列回调函数onCreate()  、onStart ()、onResume()、onPause()、onStopped()、onDestory(),当activity在不同状态之间切换时,系统可以调用这些回调函数,确保activity正常运行。

                           Activity状态和生命周期

当activity处于started,resumed,paused状态时,activity处于可见状态。当activity处于stopped时,activity处于不可见状态。

在实验过程中,当用户点击app图标之后,onCreate方法还没执行之前,activity就已经被实例化并存在于task中,activity的窗口处于可见状态,但是activity中内容不可见,只是在处于resumed状态之后activity中的内容才处于可见并可交互状态。 

activty存在不同的状态,在生命周期内状态会根据用户的操作而改变,当activity的状态发生改变时,我们需要在相应的回调函数中做一些操作来确保app的正常稳定的运行。下面我们来了解一下,在进入不同的状态前我们需要做的事情:

1. onCreate

这个方法必须被实现,在activity首次被创建时系统会调用onCreate方法,在activity的一个生命周期内onCreate只会被调用一次。所以在onCreate方法内放一些控件的初始化和一些全局变量初始化的工作。

2. onStart

这个方法后activity要进入用户可见的状态了,在这个方法内可以注册一些变量,但这些变量只有在。比如说在这个方法内开始一些动画播放的动作。这个方法和onStop相对应,需要在onStop的时候清除的的资源可以在onStart的时候初始化,这样在activity从后台回到前台时就可以恢复原来的状态。

3. onResume

onResume方法在activity的生命周期内可能被多次调用,当activity从paused状态返回resumed状态时就会调用onResume方法。在onResume中可以做一些UI刷新的工作,每当activity调用到这里时可以刷新一下UI的状态。

4. onPause

在paused状态下,activity仍然可见,但是失去焦点不可交互(比如被dialog遮挡)。这个时候activity很可能即将进入后台,一边要做些释放资源的工作。

5. onStop

在stopped状态下,activity处于不可见状态,这个时候要释放掉一些在onStart中初始化的资源和保存一些需要持久化的数据。

6. onDestory

activity被销毁时,会回调onDestory方法,在onDestory中需要释放在onCreate中初始化的资源。

2. Activity状态的切换

在两个Activity之间切换时,两个Activity的状态是如何变化?在实验中发现,两个LifeCycleActivity和SecondActivity之间切换时,他们的状态切换如下所示:

I/com.zj.activitylifecycle.LifeCycleActivity:  ---> first time onCreate
I/com.zj.activitylifecycle.LifeCycleActivity:  ---> onStart
I/com.zj.activitylifecycle.LifeCycleActivity:  ---> onResume
I/com.zj.activitylifecycle.LifeCycleActivity:  ---> onPause
I/com.zj.activitylifecycle.SecondActivity:  ---> first time onCreated
I/com.zj.activitylifecycle.SecondActivity:  ---> onStart
I/com.zj.activitylifecycle.SecondActivity:  ---> onResume
I/com.zj.activitylifecycle.LifeCycleActivity:  ---> onStop
在启动SecondActivity之后,第一个LifeCycleActivity首先进入paused状态,在SecondActivity进入resumed之后,LifeCycleActivity进入stopped状态。这也说明其实在第二个Activity被创建(created和started状态)的时候,第一个Activity其实还是处于可见状态,但是已经无法与用户交互,在第二个Activity进入resumed状态之后,第一个Activity才进入到stopped状态。我们在onResume中进行操作时,尽量不要做耗时的操作,这样会影响两个Activity之间切换的流畅度。

关于这几个重载方法之间的区别,在这片博文中有比较详细的描述可以参考:https://blog.****.net/a78270528/article/details/46926553