Android开发—-Activity生命周期

Activity作为四大组件之首,也是使用最频繁的一种组件。本文将主要讲解Activity生命周期,包括正常情况下的Activity生命周期和异常情况下的Activity生命周期。

1. 正常情况下的Activity生命周期

所谓正常情况下的生命周期,是指有用户参与的情况下,Activity所经过的生命周期的改变。正常情况下,Activity会经历如下过程。

如图所示:

(1)onCreate:表示Activity正在被创建,适合做一些初始化工作。实际应用中一般会初始化成员变量和加载布局资源。

(2)onRestrat:表示Activity正在被重新启动。一般是从不可见重新变为可见状态是调用。

(3)onStart:表示Activity正在被启动,即将开始,此时已经可见,但仍旧在后台,无法与用户交互,虽可见,但是我们还看不到。

(4)onResume:表示Activity已经可见了。此时Activity显示到前台。

(5)onPause:表示Activity正在停止,此时可以做一些存储数据、停止动画等操作,但不宜太耗时。因为此方法执行完,新的Activity的onResume才会执行

(6)onStop:表示Activity即将停止,此时可以做一些回收工作,同样不能太耗时。

(7)onDestroy:表示Activity即将被销毁,此时可以做一些资源释放。

需要注意的是,如果新的Activity采用了透明主题,当前Activity便不会回调onStop。一般情况下是按照图中的顺序来的。onStart和onStop是从Activity可见与否这个角度来配对的,onResume和onPause是从Activity是否位于前台这个角度来配对的。

2. 异常情况下的Activity生命周期

所谓异常情况下的生命周期,是指Activity被系统回收或者当前设备Configuration改变导致的Activity被销毁重建。

一种典型的触发条件是横竖屏时,手机会拿到两张不同的图片,此时Activity就会被销毁并且重建。异常销毁时,onPause、onStop、onDestroy均会被调用,在onStop之前,系统会调用onSaveInstanceState来保存当前Activity的状态(Activity会委托Window,Window再委托给顶层容器DecorView去保存数据,最后顶层容器再一一通知其子View来保存数据)。当重建时,系统会在onStart之后调用onRestoreInstanceState,销毁时onSaveInstanceState所保存的Bundle对象作为参数传给onRestoreInstanceState和onCreate,用于取出数据并恢复(Google建议我们采用前者去恢复数据)。

当然是有方法去阻止系统去重建Activity的,我们可以为Activity指定configChanges属性:

(1)比如我们不想在屏幕旋转时重建Activity,那么就可以指定android:configChanges=”orientation”。

(2)其中用的比较多的另两个属性为locale、keyboardHidden。前者为设备的本地位置发生了改变,一般指切换了系统语言。后者一般指用户调出了键盘。

(3)screenSize属性和smallestScreenSize属性比较特殊,他们是API13时添加的。分别表示的情况为屏幕尺寸发生变化和切换到外部显示设备时。若android:configChanges=”orientation|screenSize”,那么在min以及target均低于13时,不会导致重启,否则导致Activity重启。在不重建时,系统没有调用onSaveInstanceState以及onRestoreInstanceState方法,而是调用了onConfigurationChanged方法

(4)Android4.2增加了一个layoutDirection属性,当改变语言设置后,该属性也会成newConfig中的一个mask位。所以ActivityManagerService(实际在ActivityStack)在决定是否重启Activity的时候总是判断为重启。需要在android:configChanges 中同时添加locale和layoutDirection。在不退出应用的情况下切换到Settings里切换语言,发现该Activity还是重启了。

3. Android为什么要设计一个生命周期呢

Google官方文档解释说,确保提供一个流畅的用户体验,在Activity切换时,以及在导致你的Activity停止甚至是销毁的意外中断的情况下,保存好Activity状态。

1.在最前台的Activity处于Resumed状态,可见,且获得焦点。你也可能正在编辑信息,这个时候跳出来一个透明提示框,这个时候你当前的Activity就进入了Paused状态,你想再次回到这个Activity时看到你编辑到一半的信息,这个时候,你就需要在onPause这个回调方法中,来执行这些操作。

2.当你按HOME键退出一个应用,或者从一个应用进入了另一个应用,这个时候之前那个Activity就变得完全不可见了,进入了Stopped状态,那么它就应该把它大多数的资源都释放出来了,因为用户看不见它,它也就不需要维持了。所以这个时候,你就需要在onStop回调方法里面来执行这些操作。

3.当你接完一个电话,再次回到之前那个Activity,它就从Stopped状态变成了Resumed状态,这个时候你肯定希望它记录住了你离开时的状态,比如说编辑了一半的信息,正停留在新闻1/3的位置。那么这个时候,你就需要在onRestart和Start回调方法里面来执行这些操作,以使它恢复这些状态。

所以综上所述,之所以会设计出不同的生命周期状态,以及各状态间转换时的回调方法,就是为了适应用户使用过程中的不同场景,进而在特定的场景让Activity完成特定的事情,以此来确保提供一个流畅的用户体验

4. Activity的生命周期是由谁控制的

ActivityManagerService是负责管理Activity的生命周期的。ActivityManagerService是一个非常重要的接口,它不但负责启动Activity和Service,还负责管理Activity和Service。

Android开发——Activity生命周期的更多相关文章

  1. android开发------Activity生命周期

    这几天工作比较忙,基本没有什么时间更新播客了. 趁着今晚有点时间,我们来简单说一下什么是Activity生命周期和它们各阶段的特征 什么是生命周期 在还没有接触android开发的时候,听到有人说Ac ...

  2. Android开发--Activity生命周期回顾理解

    Activity和Servlet一样,都用了回调机制.我们通过类比servlet来学习Activity.当一个servlet开发出来之后,该servlet运行于Web服务器中.服务器何时创建servl ...

  3. android开发之生命周期

    android开发之生命周期 一:Activity的生命周期: 这几天了了解了安卓Activity的生命周期,对于生命周期有了大概的理解: 一个Activity的生命周期也就是Activity从生成到 ...

  4. Android编程: Activity生命周期和LogCat使用

    学习内容:Activity生命周期和LogCat使用 ====Activity生命周期==== 图示(转载): 创建    onCreate重启    onRestart开始    onStart恢复 ...

  5. 浅谈Android之Activity生命周期

     Activity作为四大组件之一,出现的频率相当高,基本上我们在android的各个地方都能看见它的踪影,因此深入了解Activity,对于开发高质量应用程序是很有帮助的.今天我们就来详细地聊聊Ac ...

  6. android 17 activity生命周期

    手机指南针传感器处于手机头部. Activity生命周期: 启动. onCreat()方法:初始化布局对象,设置监听器. onstart()方法:注册监听器. onResume():activity已 ...

  7. Android之Activity生命周期简介

    概述 有图有真相,所以先上图: 上图是从Android官网截下的Activity的生命周期流程图,结构非常清晰,它描述了Activity在其生命周期中所有可能发生的情况以及发生的先后顺序,下面就将结合 ...

  8. 【Android】Activity 生命周期具体解释

    与其它编程模式不同,android中的Activity没有main()函数.我们无法决定Activity的创建和销毁过程,Activiy的创建和销毁(即生命周期)由系统完毕,系统会在Activity的 ...

  9. Android关于Activity生命周期详解

    子曰:溫故而知新,可以為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细研读几遍,以领悟到作者的思想精 ...

随机推荐

  1. 506 Relative Ranks 相对名次

    给出 N 名运动员的成绩,找出他们的相对名次并授予前三名对应的奖牌.前三名运动员将会被分别授予 “金牌”,“银牌” 和“ 铜牌”("Gold Medal", "Silve ...

  2. DNS练习之正向解析

    配置正向解析: 主机名:sishen63 主机IP:192.168.1.63 操作系统:Red Hat Enterprise Linux Server release 6.5 (Santiago) 安 ...

  3. 【转】java序列化一定要应该注意的6个事项!

    1.如果子类实现Serializable接口而父类未实现时,父类不会被序列化,但此时父类必须有个无参构造方法,否则会抛InvalidClassException异常. 2.静态变量不会被序列化,那是类 ...

  4. CF749C Voting

    题目链接: http://codeforces.com/problemset/problem/749/C 题目大意: 共有n个人,编号为1~n.他们每个人属于且仅属于R阵营或N阵营中的一个.现在他们要 ...

  5. P3368 【模板】树状数组 2 单点查询与区间修改

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  6. Android Studio V4 V7 包冲突的问题

    最近被包冲突的问题搞奔溃了,特别是V4,V7 V4和V7包冲突的解决方式就是!版本要一致!! 比如我的一个项目中应用本来是这样引用包的 compile 'com.android.support:sup ...

  7. NYOJ 题目42 一笔画问题

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...

  8. import downloadjs from 'downloadjs' 如果是自己写的函数 没用默认导出 记得加花括号 例如 import { download } from './data.js'

    import downloadjs from 'downloadjs' 如果是自己写的函数 没用默认导出 记得加花括号 例如 import { download } from './data.js'

  9. docker 的容器入门

    Linux Namespace LXC所实现的隔离性主要是来自kernel的namespace, 其中pid, net, ipc, mnt, uts 等namespace将container的进程, ...

  10. 《3+1团队》【Alpha】Scrum meeting 2

    项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 3+1团队 团队博客地址 https://home.cnblogs.com/u/3-1group ...