Android之Activity生命周期简介
概述
有图有真相,所以先上图:

上图是从Android官网截下的Activity的生命周期流程图,结构非常清晰,它描述了Activity在其生命周期中所有可能发生的情况以及发生的先后顺序,下面就将结合此图详细介绍一下Activity的生命周期。
--- ---
Activity四大基本状态
Activity生命周期一般分为四个基本状态,分别是活动状态(running),暂停状态(paused),停止状态(stopped)和死亡状态。
活动状态(running)
活动状态一般是指该Activity正处于屏幕最显著的位置上显示,即该Activity是在Android活动栈的最顶端。
一般地当Activity 创建后就是处于该状态中。
期间触发的函数及顺序为: onCreate() ->onStart() -> onResume()。
其中:
onCreate()只有在该Activity是第一次被创建时才会被调用,主要是负责Activity的一般性的初始化设置,包括视图的创建,数据的绑定等等。需要注意的是若之前有冻结的state(即系统对该Activity调用过onSaveInstanceState()函数),则可以通过其 Bundle 参数进行state恢复。
onStart()是当Activity正在变为可见状态时才会被调用。一般地在此期间可以注册一个广播等等。
onResume()是在该Activity将要和用户进行交互时被调用,此时Activity位于的活动栈顶部。暂停状态(paused)
暂停状态一般指该Activity已失去了焦点但仍然是可见的状态(包括部分可见)。一个处于暂停状态的Activity只有在系统极度缺乏内存资源的情况下才会被系统强制结束。
运行状态到暂停状态所触发的函数及顺序为:onResume() -> onPuased()。
暂停状态恢复至运行状态所触发的函数及顺序为:onPuased() -> onResume()。
其中:
onPuased()是当一个Activity失去系统焦点后将会被调用,包括见面被部分遮挡,以及设备转入休眠状态等等。一般地在此期间对一些未保存的数据进行持久化并停止其他需要耗费CPU的操作,同时不可进行耗时操作,否则会阻塞系统UI线程。- 停止状态(stopped)
停止状态一般指该Activity被另一个Activity完全覆盖的状态,这是它仍然保持所有的状态,但是由于该Activity变得不可见,所以系统经常会由于内存不足而将该Activity强行结束。
暂停状态到停止状态所触发的函数及顺序为:onPuased() -> onStop()。
停止状态恢复至运行状态所触发的函数及顺序为:onStop() -> onRestart() -> onStart() -> onResume()。
其中:
onStop()是当一个Activity变为不可见时将会被调用,此时可能是由于该Activity要被注销或新的Activity完全遮挡了该Activity。在此期间一般可以进行取消注册广播等操作,因为用户不可见。
onRestart()是当一个Activity从停止状态恢复至运行状态时将会被优先调用。 死亡状态
死亡态是指该Activity被系统销毁。当一个Activity处于暂停状态或停止状态时就随处可能进入死亡状态,因为系统可能因内存不足而强行结束该Activity。
停止状态到死亡状态分为两种情况:(1)由用户操作导致,则执行:onStop() -> onDestroy()。(2)由系统自动强制执行,则该Activity被强行结束。
其中:
onDestroy()是当一个Activity正在被系统finished期间被调用的。
--- ---Activity七大生命周期函数
Activity一共有七个生命周期函数,分别为onCreate(),onRestart(),onStart(),onReusme(),onPause(),onStop(),onDestory()。它们的被调用的情况以及作用已在上一段中进行了相关的介绍分析,在此就不再赘述。
其实在一个Activity整个生命周期中上述七大生命周期函数并不是一定都会被执行的,有时由于系统内存不足的缘故,部分生命周期函数将会被跳过不执行。
一般地onCreate(),onRestart(),onStart(),onReusme()这四个函数是不能被系统跳过不执行的,而onDestory()函数在系统内存不足时,该函数将直接被系统跳过不执行。
onPause()函数比较特殊,即使在系统内存不足时,也一定会执行完该函数后其Activity才会被强制结束,原因是下一个Activity在等到该函数结束前前是不会继续进行。所以该函数常常用于对数据的持久化操作,同时也禁止进行任何耗时的操作。
onStop()函数则最为特殊,当Android的运行环境为HONEYCOMB即3.0之前的版本时,onStop()函数是可以被系统跳过不执行的。但是在HONEYCOMB即3.0之后的版本,onStop()函数和onPause()函数一样不能被跳过不执行。
--- ---切换横竖屏触发的生命周期事件
- 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。
- 设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。
- 在Android3.2之前,设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。但在Android3.2及其之后,仍会重新调用各个生命周期一次,因为screen size也开始跟着设备的横竖切换而改变。
Android3.2及其之后,设置Activity的android:configChanges="orientation|keyboardHidden|screenSize“,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。
--- ---总结
关于Android中四大组件之一Activity的生命周期简介就先写到这里了,其实还有很多方面没介绍到,例如对于onSaveInstanceState()函数和onRestoreInstanceState()函数的用法以及与onPause()函数间的区别都没涉及,下次有机会再好好总结,不行了实在是困死了,最后若本文有所疏忽及不当之处欢迎大家指正。
--- ---
Android之Activity生命周期简介的更多相关文章
- Android开发——Activity生命周期
Android开发--Activity生命周期 Activity作为四大组件之首,也是使用最频繁的一种组件.本文将主要讲解Activity生命周期,包括正常情况下的Activity生命周期和异常情况下 ...
- android开发------Activity生命周期
这几天工作比较忙,基本没有什么时间更新播客了. 趁着今晚有点时间,我们来简单说一下什么是Activity生命周期和它们各阶段的特征 什么是生命周期 在还没有接触android开发的时候,听到有人说Ac ...
- Android编程: Activity生命周期和LogCat使用
学习内容:Activity生命周期和LogCat使用 ====Activity生命周期==== 图示(转载): 创建 onCreate重启 onRestart开始 onStart恢复 ...
- Android开发--Activity生命周期回顾理解
Activity和Servlet一样,都用了回调机制.我们通过类比servlet来学习Activity.当一个servlet开发出来之后,该servlet运行于Web服务器中.服务器何时创建servl ...
- android 17 activity生命周期
手机指南针传感器处于手机头部. Activity生命周期: 启动. onCreat()方法:初始化布局对象,设置监听器. onstart()方法:注册监听器. onResume():activity已 ...
- 浅谈Android之Activity生命周期
Activity作为四大组件之一,出现的频率相当高,基本上我们在android的各个地方都能看见它的踪影,因此深入了解Activity,对于开发高质量应用程序是很有帮助的.今天我们就来详细地聊聊Ac ...
- 【Android】Activity 生命周期具体解释
与其它编程模式不同,android中的Activity没有main()函数.我们无法决定Activity的创建和销毁过程,Activiy的创建和销毁(即生命周期)由系统完毕,系统会在Activity的 ...
- Android关于Activity生命周期详解
子曰:溫故而知新,可以為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细研读几遍,以领悟到作者的思想精 ...
- Android之Activity生命周期详解
Activity的生命周期方法: onCreate()--->onStart()--->onResume()--->onPause()--->onStop()--->on ...
随机推荐
- bzoj1588 [HNOI2002]营业额统计(Treap)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 11485 Solved: 4062[Submit][Sta ...
- cocos2d的框架思路
这是我第一次写cocos的框架思路哈,虽然只是写完了一个程序,按理来说应该再多写一些,多积累一些经验了再来写这个框架的构成,但是我觉得还是把我这次写代码的所有想法先记下来哈,等到以后继续写cocos的 ...
- JavaScript中的加号
JavaScript中的加号“+”可以作为数学运算符的加,也可以作为字符串拼接,也可以作为一元运算符,表示正数. 1+2 "2"+"3" 3+"2&q ...
- Servlet工作原理
Servlet生命周期分为三个阶段: 1,初始化阶段 调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...
- mybatis处理单表多表操作以及动态sql和批量操作
一.单表操作 建立了相应的mapper映射接口类后,在src/main/resources目录下的自己建立的mapper文件夹下创建映射类 select操作:用select标签 属性id为映射接口的方 ...
- mysql备份数据库
需求: 1,每天4点备份mysql数据: 2,为节省空间,删除超过3个月的所有备份数据: 3,删除超过7天的备份数据,保留3个月里的 10号 20号 30号的备份数据: #创建shell文件 vim ...
- Tips--8080端口被占用了怎么办
下面以win7为例: 打开任务管理器 ctrl+alt+. 找到8080端口对应的PID 停止相应PID的进程即可:
- 【bzoj2434】[Noi2011]阿狸的打字机
题目描述 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的:l 输入小写字 ...
- [转]【基于zxing的编解码实战】精简Barcode Scanner篇
通过<[搞定条形码]zxing项目源码解读(2.3.0版本,Android部分)>的分析,现在可以实现最终目标了:精简Barcode Scanner并将其中的编码和解码分离为两个独立的部分 ...
- 技术型创业者easy遇到的三大问题
关于创业这事儿.由于经历的事情实在是太多了,所以真是想到哪儿写到哪儿. 这一篇算是<杂记>的番外篇.我今天想说的东西太多了,实在是非常想和很多其它人讨论讨论关于创业的事情. 这样的感觉就像 ...