Activity生命周期场景解析

初识Activity

活动是一种包含用户界面的组件,主要用于和用户进行交互。我们在开发中创建Activity后,通过调用setContentView(View)方法来给该Activity指定一个布局界面,而这个界面就是提供给用户进行交互的。

返回栈

Android系统中是通过任务(Task)来管理活动的。一个任务就是一组放在栈里的活动的集合,因此这个栈也被称做返回栈(Back Stack)。栈是一种后进先出的数据结构,默认情况下,每当我们启动了一个新的活动,它会在返回栈中入栈,并处于栈顶的位置。而每当我们按下back键或调用finish()方法去销毁一个活动时,处于栈顶的活动就会出栈,这时前一个如栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。

活动状态

每个活动在其生命周期中最多可能会有4种状态:

运行状态:

活动位于返回栈的栈顶,也就是活动被移到了前台。

暂停状态:

活动仍然可见,但是不再处于返回栈的栈顶。如一个活动被另一个非全屏的活动所覆盖(比如一个弹窗),那么前一个活动就失去了焦点,但它仍然完全活着。处于暂停状态的活动,它仍然保留所有的状态和成员信息,并且仍然是依附在WindowsManager上,系统内存在极度缺乏的时候会将它杀死。

停止状态:

活动不再位于返回栈的栈顶,且完全不可见。如一个活动被另一个全屏活动完全覆盖。处于停止状态的活动,它的状态和成员信息会保留,但是Activity已经不再依附于WindowManager了,同时,在系统缺乏资源的时候会将它杀死(它会比暂停状态的活动先杀死)。

销毁状态:

活动从返回栈中被移除。

PS:

如果一个活动在处于停止或者暂停的状态下,系统内存缺乏时会将其结束(finish)或者杀死(kill)。这种非正常情况下,系统在杀死或者结束之前会调用onSaveInstance()方法来保存信息,同时,当Activity被移动到前台时,重新启动该Activity并调用onRestoreInstance()方法加载保留的信息,以保持原有的状态。

生命周期

周期即活动从开始到结束所经历的各种状态。生命周期即活动从开始到结束所经历的各个状态。从一个状态到另一个状态的转变,从无到有再到无,这样一个过程中所经历的状态就叫做生命周期。
Activity类中定义了7个回调方法,覆盖了生命周期的每一个环节。

onCreate()

该方法会在活动第一次被创建的时候调用,所以应该在该方法中完成活动的初始化操作。比如加载布局、绑定事件等。

onStart()

该方法在活动由不可见变为可见的时候调用。

onResume()

该方法在活动准备和用户进行交互的时候调用。此时活动一定位于返回栈的栈顶,并且位于运行状态。

onPause()

该方法在系统准备去启动或恢复另一个活动的时候调用。通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据。

onStop()

该方法在活动完全不可见的时候调用。它和onPause()方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么onPause()方法将被调用,而不会调用onStop()。

onDestroy()

该方法在活动被销毁之前调用,之后活动从返回栈中被移除,处于销毁状态。

onRestart()

该方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。

以上7个方法中除了onRestart()方法,其它都是相互对应的,因此又可以将活动分为3种生存期:

完整生存期

活动在onCreate()和onDestroy()方法之间所经历的,就是完整生存期。一般情况下,一个活动会在onCreate()方法中完成各种初始化操作,从而在onDestroy()方法中完成释放内存的操作。

可见生存期

活动在onStart()方法和onStop()方法之间所经历的,就是可见生存期。在可见生存期内,活动对于用户总是可见的,即便有可能无法与用户进行交互。我们可以通过这两个方法,合理地管理那些对用户可见的资源。比如在onStart()方法中对资源进行加载,而在onStop()方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。

前台生存期

活动在resume()方法和onPause()方法之间所经历的就是前台生存期。在前台生存期内,活动总是处于运行状态的,此时活动是可以和用户进行交互的。

Android官方的活动生命周期示意图如下:
Android生命周期.jpg
从图可以得知,Activity首次可见时经历的是:onCreate()–>onStart()–>onResume(),那么其它方法又是怎样调用的呢?为了加深理解,我们可以手动写几个Activity,通过log的方式看一下Activity在实际场景中各个方法是怎样调用的。

场景一:Home键操作

按下Home键返回桌面,这时Activity由可见到不可见,但实际Activity还未被销毁,那么经历的就是:
image.png
返回App,这时Activity由不可见到可见,那么经历的就是:
image.png

场景二:back键操作

按下back键返回桌面,这时Activity由可见到不可见,并且Activity被销毁,那么经历的就是:
image.png
返回App,这时Activity销毁状态到可见,那么经历的就是:
image.png

场景三:Activity间跳转

跳至另一个Activity,这时前一个Activity由可见到不可见,但实际上该Activity未被销毁,同时后一个Activity也要启动到前台,那么经历的就是:
image.png
返回至前一个Activity,这时后一个Activity由可见到不可见,并且该Activity也要被销毁,同时前一个Activity也要由不可见到可见,那么经历的就是:
image.png

场景四:弹窗

弹出弹窗,前一个Activity并未完全不可见,弹窗启动到可见,那么经历的就是:
image.png
弹窗消失,前一个Activity完全可见,那么经历的就是:
image.png

场景四:横竖屏(默认竖屏)

横屏
image.png
竖屏
image.png

猜你喜欢

转载自blog.csdn.net/lks1139230294/article/details/84781125