博主声明:

转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主 威威喵 原创,请多支持与指教。

本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/smile_running

在学习 Android 时候,通常一开始学习的都是它的生命周期,谁让我们第一个创建的就是 MainActivity 类呢。学习 Activity 就要从它的生命周期入手,这是我们了解它最快的一种方式,了解它的生命周期,大概就可以知道它的工作时间。比如,我们创建应该 MainActivity 就要重写它的 onCreate 方法,在 onCreate 中通过 setContentView 设置布局文件才能够真正的感受到 Activity 的存在,如果没有 setContentView 就是灰白灰白的,空空如也。

这次呢。我们先不去管它 setContentView 干了哪些事情,先来把 Activity 的几种生命周期及情境搞明白。百度偷了一张图过来,自己懒得画了,将就看吧:

这张图,从上到下罗列了 Activity 的几种生命周期,它的几种生命周期分为四中状态,如下图:

下面是一些概念性的描述,蛮看吧,反正也记不住!

onCreate : 该方法是在Activity被创建时回调,它是生命周期第一个调用的方法,我们在创建Activity时一般都需要重写该方法,然后在该方法中做一些初始化的操作,如通过setContentView设置界面布局的资源,初始化所需要的组件信息等。

onStart : 此方法被回调时表示Activity正在启动,此时Activity已处于可见状态,只是还没有在前台显示,因此无法与用户进行交互。可以简单理解为Activity已显示而我们无法看见摆了。

onResume : 当此方法回调时,则说明Activity已在前台可见,可与用户交互了(处于前面所说的Active/Running形态),onResume方法与onStart的相同点是两者都表示Activity可见,只不过onStart回调时Activity还是后台无法与用户交互,而onResume则已显示在前台,可与用户交互。当然从流程图,我们也可以看出当Activity停止后(onPause方法和onStop方法被调用),重新回到前台时也会调用onResume方法,因此我们也可以在onResume方法中初始化一些资源,比如重新初始化在onPause或者onStop方法中释放的资源。

onPause : 此方法被回调时则表示Activity正在停止(Paused形态),一般情况下onStop方法会紧接着被回调。但通过流程图我们还可以看到一种情况是onPause方法执行后直接执行了onResume方法,这属于比较极端的现象了,这可能是用户操作使当前Activity退居后台后又迅速地再回到到当前的Activity,此时onResume方法就会被回调。当然,在onPause方法中我们可以做一些数据存储或者动画停止或者资源回收的操作,但是不能太耗时,因为这可能会影响到新的Activity的显示——onPause方法执行完成后,新Activity的onResume方法才会被执行。

onStop : 一般在onPause方法执行完成直接执行,表示Activity即将停止或者完全被覆盖(Stopped形态),此时Activity不可见,仅在后台运行。同样地,在onStop方法可以做一些资源释放的操作(不能太耗时)。

onRestart :表示Activity正在重新启动,当Activity由不可见变为可见状态时,该方法被回调。这种情况一般是用户打开了一个新的Activity时,当前的Activity就会被暂停(onPause和onStop被执行了),接着又回到当前Activity页面时,onRestart方法就会被回调。

onDestroy :此时Activity正在被销毁,也是生命周期最后一个执行的方法,一般我们可以在此方法中做一些回收工作和最终的资源释放。

其实,说白了就对应几种状态(创建和销毁状态、可见与不可见状态、是不是可操作状态),如下图:

每一种生命周期都两两相对,除了 onRestart 比较特殊,单身狗,被孤立了。反正,这样看是很难记住的,太过于概念化的东西容易忘记,必须手动操作一波,记得更牢固。

来吧,实际操作一下。书本上的老套路,一个 MainActivity,一个 SecondActivity,也许有人会觉得能比书上详细吗?这我不敢说,但是我看的基本入门书,好多都没讲到,也就是介绍一下生命周期而已,一些情境都没涉及到,如果你看下去,就会知道有哪些区别了。

首先,我们启动一个 Activity 时,第一个启动的是 Application,毫无疑问,Application 的生命周期是最长的,也就是你点开那个桌面小图标时,它就已经启动了。于此同时,Application 就会寻找它下面一级带有 LAUNCHER 的过滤器,然后启动的就是这个 Activity,参考下面的 manifest 代码:

    <applicationandroid:name=".App"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"tools:ignore="AllowBackup,GoogleAppIndexingWarning"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".SecondActivity" /></application>

这里就解释了,Activity 并不是平白无故的启动,只有在清单文件中注册过的才能启动,当然,一个程序是可以不用任何 Activity 的。

Application 的启动,通常就只有 onCreate 是它的生命周期,在低内存下还会执行其他的方法。Application onCreate 之后,就轮到 MainActivity 的 onCreate,下面来看这一段截图:

 1、当一个 Activity 启动完成时,它的生命周期如上图所示

onCreate -> onStart 从不可见 到 可见 -> onResume 从不可交互 到 可交互。

2、点击 helloword 启动了 SecondActivity ,生命周期的变化如下:

MainActivity 没有执行 finish() 方法, 变成了 onStop 停止状态,意味着不可见,不可交互。启动 SecondActivity 生命周期是一样,不再说了。

3、当点击 back 时,生命周期变化如下:

首先,它执行的是 SecondActivity 的 onBackPressed 的方法返回。可以看到,MainActivity 在前面执行到 onStop,当按下 back 时,它执行的是 onRestart -> onStart -> onResume

而 SecondActivity 执行了 onStop -> onDestroy ,表示由停止状态 被 摧毁了。

4、当在 MainActivity 里面执行了 finish() 方法,将 MainActivity 关闭了,又会怎么样呢?

可以看到,MainActivity finish 后,不仅执行了 onStop,还执行了 onDestroy,彻底的把 MainActivity 给摧毁了。

5、MainActivity 被摧毁了,这时再按 back 会怎么样呢?

显然 MainActivity 已经没了,两个 Activity 都被摧毁了,最后也只能回到桌面上了。

6、这个时候,再此点击桌面图片,会再次创建 Application 吗?

答案是不会的,因为我们的 Application 并没有被杀死,所以这里的 App 的 onCreate 就不会再执行了。

7、那如何保证彻底退出应用程序呢,保证杀死 app 呢?

我们通过 SecondActivity 的 onBackPressed() 方法内加入: System.exit(0) ,表示杀死当前应用,彻底退出程序,看看效果:

点击 back,再次点击桌面图片,发现 App 的 onCreate 执行了,表明我们刚刚成功的杀死这个进程了。

8、切换任务管理快捷键时,生命周期会有什么变化?

9、按下 home 有什么变化呢?

原来是这样的,是不是发现了什么规律呢?

如果没有执行 finish,那么 Activity 就不会 onDestroy,而按下 back 时,相当于 finish 了,必定执行 onDestroy

当按下 home 和 任务管理 时,这时 Activity 处于不可见状态,但又没有被 finish,所以它只会到 onStop,然后等待被 onReStart,如果这个期间被结束任务了,那它会执行 onDestroy 吗?

答案是不会的,看上面一个图,从任务里面杀死了 app,并不会执行 onDestroy。

WTF,写到最后,才发现我前面漏掉了一个 onPause 生命周期方法。由于图太多了,懒得重新弄了。onPause 是会在 onStop 之前执行的,如果 onStop 执行了,那么必定会执行 onPause,自己试一试吧,多的不说了。Activity 息息相关的也就这几种场景的生命周期,属于正常的生命周期。

还有就是 System.exit(0) 强行把 app 杀死了,这样的话,就会导致 onPause、onStop 、onDestroy 等生命周期没办法执行,如果要保存 Activity 一些数据的话,这样没法从  onPause、onStop 、onDestroy 中获取数据。

System.exit(0)也是会有问题的,比如在开启 SecondActivity 时,没有把 MainActivity 给 finish 调,这时它又会启动一个新的 MainActivity ,比如出现这样的情况:

这中情况发生的概率也很高,如果对 System.exit(0) 不了解的话,就会出现问题。解决的方式就是最好新建一个管理所以 Activity 的工具类,在真正需要退出 app 的地方,把 Activity 全部都 finish 掉,然后再 System.exit(0) 就不会有问题了。

还有一种是 ANR 的情况发生,如果等待能完成到还好,如果完成不了,那么这种情况下也不会执行 onPause、onStop 、onDestroy,比如用户在输入完成后提交发生了 ANR,那么这些刚刚填的信息应该如何保证能够保存呢?

当然,我们可以通过监听控件的事件来保存,这是一种办法。

Activity 生命周期详解与异常情况生命周期相关推荐

  1. java servlet 周期_java servlet生命周期详解,一个servlet生命周期包括哪些?

    小伙伴们知道servlet吗?这次我们要说的是java中的servlet,小伙伴们知道servlet的声明周期都包括哪些吗?下面就听小编介绍介绍吧. Servlet生命周期包含哪些? 我们要了解,一个 ...

  2. Android面试之Activity生命周期详解

    Activity生命周期详解 一 Activity的四种状态: Activity的生命周期中存在四种基本的状态:活动状态(Active/Runing),暂停状态(Paused),停止状态(Stoppe ...

  3. Android Activity 生命周期详解及监听

    前言 系列文章: Android Activity 与View 的互动思考 Android Activity 生命周期详解及监听 Android onSaveInstanceState/onResto ...

  4. flutter 生命周期详解

    flutter 生命周期详解 简介 一.widget 生命周期 二.APP 生命周期 总结 简介 众所周知,程序是有生命周期的,那么flutter 的生命周期是什么呢? flutter 的生命周期大体 ...

  5. Fragment生命周期详解

    关于Fragment的生命周期,博主写过Activity与Fragment生命周期详解,基本上把Fragment的生命周期详细介绍过,但是那仅仅是创建一个Fragmnet时的生命周期,而事实上Frag ...

  6. Java 类的生命周期详解

    一. 引 言 最近有位细心的朋友在阅读笔者的文章时,对Java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大 ...

  7. Android生命周期详解

    最近在看任玉刚老师的开发艺术探索,记录一下. Android生命周期分为两部分: 一.典型情况下的生命周期. 二.异常情况下的生命周期. 一.典型情况下的生命周期 典型情况下的生命周期指在有用户参与的 ...

  8. Fragment的懒加载与生命周期详解

    提示:本文仅为笔者学习记录 Fragment的懒加载与生命周期详解 什么是懒加载 了解Fragment的生命周期 onAttach onCreate onCreateView onActivityCr ...

  9. vue 声明周期函数_Vue 生命周期详解

    Vue 生命周期详解 Vue 生命周期流程 最开始,用户使用 new Vue() 创建根 Vue 实例,或者 Vue 实例化子组件都会调用_init方法(我们将这两种实例都称为vm): functio ...

  10. taro生命周期详解

    taro生命周期详解 taro介绍 生命周期 react的钩子函数 为兼容小程序的钩子函数 个别生命周期详解以及注意 1.render()函数 2.constructor()构造函数 3.在各个生命周 ...

最新文章

  1. oracle里minis用法,Oracle初学者必知的39个问题
  2. python 打开当前目录的txt文件-Python - 读取其他文件夹/目录中的文本文件
  3. Gridview数据控件的七种字段类型
  4. 医学图像处理期末复习(二)
  5. python pip工具命令_转载 Python 安装setuptools和pip工具操作方法(必看)
  6. iZotope Neutron 3 Advanced for mac(智能混音插件包)
  7. Linkage 使用方法总结
  8. Chrome 87 发布,获多年来最大性能提升
  9. 我的LINUX学习之路之十三之用脚本通过PXE安装LINUX
  10. C++迭代器(STL迭代器)
  11. get与post的区别
  12. 美图录爬虫(requests模块,re模块)
  13. 一文看懂一般性采购、战略采购与项目型采购的区别
  14. 小项目----音乐在线播放器
  15. 无投戎之志,愿成技术届一股清流
  16. 元胞自动机模拟森林火灾--matlab实现
  17. CMD命令查看局域网内所有主机名及IP
  18. f7功能键使用计算机,【ThinkPad】F1-F12功能键最全使用指南
  19. 微信小程序实现短信认证功能
  20. tikz包 安装_latex中tikz宏包的使用(1)

热门文章

  1. es搜索同义词近义词技术方案
  2. 用思维导图描绘5G场景
  3. html代码中font是什么意思,HTML元素font标签的使用方法及作用
  4. rk3288 android4.4,RK3288 Android4.4使用A6212,wifi可以用但是蓝牙起不来
  5. 中国裁判文书网爬虫思路分享
  6. 白云市场高仿包值不值得买?
  7. keep跑步记录伪造_Keep、悦跑圈、咕咚、悦动圈,四个跑步App比对
  8. 【Love2d从青铜到王者】第十四篇:Love2d之分享你的游戏(Distributing your game)
  9. Apollo公开课四:感知
  10. 光纤信号服务器,485转光纤的两种方式