Android开发之---Activity生命周期
Android开发中,有四大组件:Activity、Service、Content Provider、Broadcast Receiver,可以说,activity的使用是最频繁的了,这里来梳理一下与activity相关的生命周期和启动模式的知识。
在正常情况下,指内存充足,有用户参与情况下,activity的生命周期过程如下图所示:

当我们启动Activity_A时,经历如下步骤:
1. onCreate函数被调用,该函数主要进行页面布局资源的初始化和数据初始化;
2. onStart函数被调用,此时页面控件树已加载完成,但是还没展示出来,还在后台
3. onResume函数被调用,此时页面显示在前台,处于活动状态 (这3步是启动一个acitivity会经历的)
4. 用户触发Activity_B启动
5. Activity_A的onPause函数被调用,在这里可以进行数据存储、动画停止等操作,但是不能进行耗时操作,让新的activity尽快显示出来,更多的资源回收可在onStop处理,否则影响Acvitiy_B的显示,因为Activity_B的onResume函数需要在Activity_A的onPause函数执行完才执行
6. Activity_A的onStop调用,回收资源 (5、6步是当前栈顶activity退出前台时会被调用)
7. 进入Activity_B
8. 用户触发返回Activity_A
9. Activity_A的onRestart函数调用,回到第二步
10. 退出Activity_A,调用次序为: onPause --> onStop --> onDestroy
Activity在Android源码的路径为:{USER_PATH}/android-5.0.0_r7_code/frameworks/base/core/java/android/app/*.java,如下:

当发生异常情况,如横竖屏变化、内存不足时,activity可能会被系统回收,这时情况如下:
默认系统会帮我们保存现场,如视图结构、已输入的部分数据,销毁时,会在onPause或onStop之后调用onSaveInstanceState,在重建activity时,在onStart后系统调用onRestoreInstanceState恢复现场。我们看看ScrollView源码怎么处理的:

scrollview的这个功能支持在4.3版本后才有的。在writeToParcel里系统保存了scrollview的滑动位置,用于后面重建activity时恢复现场。
类似的,可以看源码来了解其他控件是保存了什么数据。
如果在异常情况发生时,需要自定义保存的数据,建议使用onSaveInstanceState和onResotreInstanceState来进行处理,当然,也可在onCreate使用其传入的参数来获取,但是注意需要进行null的判断,因为第一次启动activity值是空的。
如果需要系统忽略默认的配置变化后的调用行为,可以在清单文件加入android:configChanges="..."配置,如为:android:configChanges="orientation|screenSize"(在minSDKVersion和targetSDKVersion均大于13时,需要orientation和screenSize都加上,这个和编译环境有关),那么,在横竖屏发生时,需要重写onConfigurationChanged(Configuration newConfig)来进行自定义处理,系统这是不会调用onCreate来重建activity了。除了orientation属性,local属性也很常用,在修改了app使用的语言后,重新刷新页面时用到。
Android开发之---Activity生命周期的更多相关文章
- Android开发----WebView&Activity生命周期
WebView webview是一个再应用中设置好位置和大小的浏览器,而且不会放置任何花哨的UI. 在大多数情况下,除非你调用了原生API,否则不必在webview中专门测试web应用. 首先为Web ...
- 【Android实验】第一个Android程序与Activity生命周期
目录 第一个Android程序和Activity生命周期 实验目的 实验要求 实验过程 1. 程序正常启动与关闭 2. 外来电话接入的情况 3. 外来短信接入的情况 4. 程序运行中切换到其他程序(比 ...
- Android-管理Activity生命周期 -重新创建Activity
按照正常的app行为,很少情况下activity会销毁,只有当用户点击了返回按钮或者activity通过调用finish()发出销毁信号.系统也有可能销毁activity如果它是停止状态并且很久没有使 ...
- Android-管理Activity生命周期 -停止和重启Activity
停止和重启activity在activity的生命周期中很重要,它能让用户感觉你的app总是激活的而且不会丢失他们的进度.activity在下面的这些情况会停止和重启: 用户打开常用app窗口然后从你 ...
- Android-管理Activity生命周期 -暂停和恢复一个Activity
在正常的使用app时,前台的activity有时候会被可见的组件阻塞导致activity暂停.比如,当打开一个半透明的activity(就像打开了一个对话框),之前的activity就会暂停.只要ac ...
- Android-管理Activity生命周期 -开始一个Activity
很多程序都是从main()方法开始启动的,和其他程序不同,android是在activity生命周期的特定状态的特定回调方法中初始化代码的.activity启动和销毁的时候都用很多回调方法. 这里将要 ...
- 【Android 应用开发】Activity生命周期 与 Activity 之间的通信
一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...
- Android体系结构及activity生命周期
Android的系统架构采用了分层架构的思想,如图1所示.从上层到底层共包括四层,分别是应用程序程序层.应用框架层.系统库和Android运行时和Linux内核 Android的系统架构图 每层 ...
- android学习笔记 activity生命周期&任务栈&activity启动模式
activity生命周期 完整生命周期 oncreate->onstart->onresume->onpause->onstop->ondestory 使用场景:应用程序 ...
随机推荐
- itertools
0. Python中引入itertools 1. 笛卡尔积: product(iter1, iter2,...,iterN,[repeat=i]) from itertools import prod ...
- 篇二:JS身份证校验
身份证校验 function identityCodeValid(code) { var city={11:"北京",12:"天津",13:"河北&q ...
- 用JS写了一个打字游戏,反正我是通不了关
今天想写个简单的游戏, 打字游戏好像都没写过, 那么就写打字游戏吧, gamePad包含了关卡的信息, 可以用来调整给个关卡字符下落的速度: getRandom函数会返回一个字符对象, 这个对象包含了 ...
- 7.Android开源项目WheelView的时间和地址联动选择对话框
类似WheelView的时间和地址联动选择对话框在现在App经常看到,今天小结下. 主布局界面: <LinearLayout xmlns:android="http://schemas ...
- miniui无法传递input值
miniui获取到的值死活传不到php去处理,input框里有值php接收到却一直为空,又是查资料.测试.搜索.提问,最后才在文档中发现尼玛miniui不用name的,其实是<input tex ...
- 关于Scala的一些感想(一)
最近在完成自己的开源项目Application-center的时候,使用了Scala编程语言. 在使用了一段时间下来以后,有一些不是很"清晰"的感受,说实话我自己还没有很好的整理清 ...
- JavaScript错误之:Uncaught ReferenceError: $ is not defined
在js开发中,很多人遇到类似问题,都找不到解决方法.Uncaught ReferenceError: $ is not defined,在这里给大家提供几个解决方法. 方法/步骤11.出现这个错误,最 ...
- 【Beta】Scrum03
Info 时间:2016.12.01 21:30 时长:15min 地点:大运村1号公寓5楼楼道 类型:日常Scrum会议 NXT:2016.12.04 21:30 Task Report Name ...
- JDK安装,环境配置
在安装完jdk后,还需要对jdk的环境变量进行配置才能正常使用 1.右键选择 计算机→属性→高级系统设置→高级→环境变量 2.系统变量→新建 变量名:JAVA_HOME 变量值:(变量值填写你的jdk ...
- thinkphp 3.2加载类
基础方式(自动加载) 控制器: public function ff(){ $t = new \Org\Util\Abc(); echo $t->ss(); } ThinkPHP\Library ...