Activity生命周期

    转载请注明出处:https://blog.csdn.net/github_38372075/article/details/80447508
    我的简书传送门
     Activity是Android组件中最基本也是最为常见用的四大组件之一,也是我们在开发过程之中接触最多的组件,所以了解Activity的生命周期,并正确的理解与应用,是必不可少的。下面就来介绍一下Activity生命周期。

生命周期

     活动在系统中被活动堆栈管理。当一个新的活动开始时,将会强加于堆栈的顶端并成为运行活动状态。而之前的活动总是被放置在这个活动下面的堆栈中,并且不会被移动到前台直到新的活动退出为止。
     活动从开始到结束经历各种状态。从一个状态到另一个状态的转变,从无到有再到无,这样一个过程中所经历的各个状态就叫做生命周期。Activity拥有自己的生命周期,而它的意义就在于,当我们对当前的界面进行展示的过程中,本身也会经历各个阶段去准备和处理当前的activity,然后展示给用户,而开发者为了界面上一些炫酷的效果与功能,做一些特殊处理时,就离不开这些生命周期。

各生命周期状态说明

     下图中展示了activity的重要的状态改变路径。矩形中的代表你可以在活动在两种状态间改变时你可以实现的回调方法去执行想要的操作。而带有颜色的椭圆形代表着activity的主要状态。
Activity生命周期_第1张图片

方法 描述 用途(以当前界面播放视频为例) 下一个方法
onCreate() 当Activity第一次创建时调用。该方法(如果有)会提供给你一个包含之前活动的冻结状态信息bundle包。 进行一系列初始化操作,如:创建View,加载视频数据等。 onStart()
onRestart() 当Activity被停止后调用,在重新开始之前 当活动停止后重新启动该活动时调用(不常用),针对停止后重启操作。 onStart()
onStart() 当Activity被展示在用户眼前时调用。如果活动出现在前台紧接着是onResume(),如果活动直接隐藏则紧接着是onStop()。 该方法也不常用。 onResume() or onStop()
onResume() 当Activity将开始与用户进行交互时调用。在这个时间点你的活动将会在活动堆栈的顶端,用户输入将会访问它。 暂停后恢复我们会在该方法中进行一些操作,例如视频继续播放。 onPause()
onPause() 当系统将要恢复一个之前的活动。这是一个有代表性的常常用于提交未被存储的改动信息为持久数据,停止动画和消耗CPU的东西等。实现该方法必须要特别的迅速,因为在此方法返回之前,下一个活动将不会恢复。如果活动将返回到前台则接下来调用onResume(),如果要隐藏到用户看不见的地方时,则调用onStop(); 该方法十分重要,用来做信息持久化存储操作以及停止消耗CPU资源操作,如记录视频播放进度时间,以及暂停视频播放操作等。 onResume or onStop()
onStop() 当另一个活动被恢复且完全覆盖该活动,而该Activity将不在展示给用户时调用。这种情况将发生在一个新的活动将被开始,一个退出的活动将被恢复,又或者该活动将要被销毁。如果该活动将恢复与用户交互则调用onRestart(),如果该活动将被销毁则调用onDestory()。 界面将会隐藏或销毁,做一些重要信息或未被存储的信息的存储操作。但也不要太耗时。如存储用户信息等操作,以及用户此次观看的视频地址以及时间,便于下次打开该界面时继续播放。 onRestart() or onResume()
onDestory() Activity被销毁钱最后一个被调用的方法。这个方法将会发生因为活动将会结束(在活动中调用finish()方法,或者系统临时销毁该实例节约空间。你可以使用isFinishing()方法区别这两种场景)。 界面将要销毁,释放一些实例节约空间,如置空List集合等。

阶段状态

Activity生命周期_第2张图片
     一个Activity从本质上讲拥有4种状态:
* 运行:如果当前的activity在前台界面上时(堆栈顶端)。
* 暂停:如果activity被另一个非全屏活动强占焦点并覆盖时(如弹窗dialog),它将会暂停。一个暂停的活动也是完全活跃的(它的所有的状态和成员信息将会保留,但activity本身将不会再依附于WindowsManager了),在内存极度缺乏的状态会被系统杀死。
* 停止:如果activity完全被另一个全屏活动遮挡住时,它将会停止。该活动也仍保留全部的状态和成员信息,但将会被隐藏起来不再展示给用户,并且当内存在其他地方被需要时该活动就将会被系统杀死。
* 重启:如果activity处于暂停或者停止状态,系统将会在内存中终止该活动无论是结束活动或者杀死进程。当它再一次展示给用户时,它必须是完全重启并且恢复到之前的状态。

状态转换

Activity生命周期_第3张图片
     上图中我们可以看到Activity在生命周期状态进行转换的过程中,activity本身是在什么时候调用的onSaveInstanceState()方法与onRestoreInstanceState()方法来进行重要信息的存储与恢复的。因为在蜂巢版本之前onSaveInstanceState()方法只有在activity异常退出时才会调用,所以我们应该在onPause()方法中进行信息持久化存储的操作,在蜂巢之后的版本,生命周期就可以正常的调用onSaveInstanceState()方法来进行信息持久化存储的操作了。

部分实例列举

     上面说了一堆Activity生命周期的定义,在实际应用中,我们更倾向于实践运用,所以我会列举部分实例。Github传送门,大家可以给我点个小星星。
* 打开activity关闭activity生命周期如下(启动与销毁)

// activity启动
05-24 11:16:44.124 16259-16259/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onCreate
05-24 11:16:44.125 16259-16259/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onStart
05-24 11:16:44.125 16259-16259/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onResume
// activity关闭
05-24 11:16:46.691 16259-16259/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onPause
05-24 11:16:47.038 16259-16259/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onStop
05-24 11:16:47.038 16259-16259/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onDestroy

     可以看到正常的启动与关闭Activity不会调用onSaveInstanceState(Bundle)方法与onRestoreInstanceState(Bundle)方法,所以如果要离开该界面时,该界面的重要信息,我们要在onPause()或onStop()方法中进行存储。
* 弹窗(dialog、popupwindow)

[空]

     没错,你没看错。是空!因为dialog与popupwindow实际上是一个存在于这个activity上的控件,所以它并不会影响activity本身的生命周期!试想如果你每次弹窗你的activity都要走onPause方法的话,那你的一些存储持久化操作是不是会不停地无更新的存储呢?所以,不要被一些说法误导,如果你不知道,那么就去动手实践。
* 打开Dialog样式的Activity(暂停状态)

// 在Manifest文件中首先设置dialog样式
".TranslateActivity"
        android:theme="@style/Theme.AppCompat.Dialog">

// 然后你懂得,我们来打开这个dialog样式的Activity
05-24 16:27:24.964 26913-26913/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onPause
05-24 16:27:25.206 26913-26913/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onSaveInstanceState
// 最后我们关闭这个Activity
05-24 16:27:28.227 26913-26913/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onResume
  • 屏幕旋转
05-24 11:24:47.377 16724-16724/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onPause
05-24 11:24:47.378 16724-16724/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onSaveInstanceState
05-24 11:24:47.378 16724-16724/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onStop
05-24 11:24:47.378 16724-16724/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onDestroy
05-24 11:24:47.451 16724-16724/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onCreate
05-24 11:24:47.454 16724-16724/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onStart
05-24 11:24:47.454 16724-16724/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onRestoreInstanceState
05-24 11:24:47.454 16724-16724/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onResume

     此处的onSaveInstanceState(Bundle)方法与onRestoreInstanceState(Bundle)方法具体执行时机,当targetSdkVersion小于3时onSaveInstanceState是在onPause方法中调用的,而大于3时是在onStop方法中调用的。而onRestoreInstanceState是在onStart之后、onResume之前调用的。
* 按Home键后再开启app(停止状态)

// 点击home键(菜单键)
05-24 11:50:25.097 17817-17817/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onPause
05-24 11:50:25.407 17817-17817/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onSaveInstanceState
05-24 11:50:25.407 17817-17817/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onStop
// 打开App
05-24 11:51:05.471 17817-17817/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onRestart
05-24 11:51:05.476 17817-17817/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onStart
05-24 11:51:05.476 17817-17817/com.perry.activitylifecycle E/TAG lifecycle:  ------>>> onResume

小结

     文章中我们具体的了解了Activity的7大生命周期与4种本质状态,还有onSaveInstanceState(Bundle)方法与onRestoreInstanceState(Bundle)具体执行时机。便于我们更好的了解与利用Activity中的每一种生命周期方法。

你可能感兴趣的:(android)