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. UWP 页面跳转传值

    如果涉及到页面跳转,一般用Frame这个控件来管理不同的页面. <Grid Name="RootGrid"> <Frame Name="RootFram ...

  2. Query on a tree IV SPOJ - QTREE4

    https://vjudge.net/problem/SPOJ-QTREE4 点分就没有一道不卡常的? 卡常记录: 1.把multiset换成手写的带删除堆(套用pq)(作用很大) 2.把带删除堆里面 ...

  3. Codeforces Round #319 (Div. 2)

    水 A - Multiplication Table 不要想复杂,第一题就是纯暴力 代码: #include <cstdio> #include <algorithm> #in ...

  4. MessageDigest简介(与MD5加密有关)

    参考文章:http://blog.sina.com.cn/s/blog_4f36423201000c1e.html 参考来源:http://blog.csdn.net/hudashi/article/ ...

  5. canvas绘图出现模糊,解决方法

    在项目开发中发现,canvas有一个问题,绘制的图会出现模糊现象. 解决方法之一:将canvas元素放大2倍,然后将整个canvas元素或者其父元素缩小两倍. <!DOCTYPE html> ...

  6. (025)[系统故障]XP下禁止将串口设备识别成鼠标(转)

    很多人都遇到过这种问题:Windows XP启动时将一台连续发送数据的串口设备识别成串口鼠标,自动安装了串口鼠标驱动,而设备因此无法正常工作,而光标则无规律地到处跑.对此问题,Internet上的方法 ...

  7. solr管理界面下统计多个时间段的数据 facet.query

    在Raw Query Parameters参数里面输入时间段即可 如下图所示: facet.query=publishTime:[2017-06-05T00:00:00Z TO 2017-06-07T ...

  8. (转)Synopsys工具简介

    DC Ultra--Design Compiler的最高版本 在Synopsys软件中完整的综合方案的核心是DC UltraTM,对所有设计而言它也是最好级别的综合平台.DC Ultra添加了全面的数 ...

  9. 1-3 编程基础 makefile工程管理

    GNU make Linux程序员必须学会使用GNU make来构建和管理自己的软件工程.GNU的make能够使整个工程的编译.链接只需要一个命令就可以完成. makefile make在执行时,需要 ...

  10. 【整理】用JSON-server模拟REST API

    用JSON-server模拟REST API https://www.cnblogs.com/ys-wuhan/p/6387791.html