Android开发艺术1之Activity的生命周期
作为《Android开发艺术探索》这本书的第一篇博客,我就多说几句。本系列博客旨在对书中相关内容进行解读,简化,提供一个入门到提高的流程。不敢说书评,也不能说教程,只希望对有些人有帮助就好,也为了让自己有个巩固的机会!!!
Activity的生命周期,所谓生命周期,就是一个事物从始至终经历的各个阶段,比如一个人的生命周期,就是出身,成年,老去,死亡等,而这每个点都不是自己把控的。Android系统也是如此,一个手机App,给人最直接的就是界面,也就是我们说的activity,当然也叫活动。屏幕上的一个界面从开始到结束以及一些其他情况下都会由系统回调对应的一些方法,具体分为2种情况:正常情况下的生命周期和异常生命周期,这个不懂吗?正常情况下就是由用户参与,比如点击某个按钮进行跳转。而异常情况下就是由于系统资源不足或者横竖屏切换等引起的生命周期自动变化。
一、正常情况下的生命周期 (七个方法)
onCreate 创建
onStart 开始显示,但还未显示出来,其实他主要是与onResume进行区别,个人认为用户是否获取焦点作为区分更好
onResume 表示activity已经可见,其实更准确的说应该是activity可以被用户触摸了,即获取焦点了
onRestart 重新开始显示,一般是activity完全不可见到再次出现,比如按Home键回到桌面,再进入
onPause 暂停,即activity失去焦点,比如一个弹窗出现等
onStop activity正在停止,意义与onStart相对
onDestroy 销毁结束
以上7个生命周期会在正常情况下发生,除了onCreate和onDestroy方法外,其余都可以在用户不同操作下多次出现。其中各种情况就不再多说明,有需要直接去尝试或者上网查阅相关资料
下面说个书中提到的比较精髓的问题:假设当前Activity为A,如果这时用户打开一个新的Activity为B,那么是B的onResume方法和A的onPause方法那个先执行?这个问题也许我们第一印象就能回答出来,但是我们还是按照实事求是的原则,查看源码去寻找准确的结果,具体方法暂时不说(嘿嘿,我也还在学习中),我们也可以直接去看Google提供的API说明:Android官方文档对onPause方法解释中有这么一句,不能在onPause中进行重量级的操作,因为必须onPause执行完成后新的Activity才能Resume!
二、异常情况下的生命周期 (非Exception)
这里主要讲的是横竖屏切换时activity会重新创建,但是这个重新创建不同于上面的,而是通过2个方法的回调onSavaInstanceState和onRestoreInstanceState来进行状态的保存和重现,这里面我们主要来讲解下系统如何进行保存状态以及我们如何来进行额外的信息保存的。
具体当异常情况发生的时候,Activity会被销毁,他的onPause onStop onDestroy都会被回调,同时会在onStop之前调用,具体调用时机与onPause不相上下。当Activity被重现创建后,会回调onRestoreInstanceState,他的回调时机在onStart之后。
下面说说系统为我们做的屏幕快照和恢复工作,异常情况下,系统会为我们保存当前activity的视图结构,并且在重启之后为activity恢复这些结构,比如文本输入框中的输入数据,选中数据,ListVeiw,ScollView当前滑动的位置等,这些都是系统为我们自动完成的,系统的做法实际上是一种代理模式,由Acitivity委托Window去保存数据,Window会委托上面的顶级容器保存数据,定期容器又会一层一层的委托他的子容器或者子控件,达到保存数据状态的效果,其实这跟事件分发,View的绘制过程等一样的原理。下面我们看下TextView源码中的onSavaInstanceState这个方法:
@Override
public Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState(); // Save state if we are forced to
boolean save = mFreezesText;
int start = 0;
int end = 0; if (mText != null) {
start = getSelectionStart();
end = getSelectionEnd();
if (start >= 0 || end >= 0) {
// Or save state if there is a selection
save = true;
}
} if (save) {
SavedState ss = new SavedState(superState);
// XXX Should also save the current scroll position!
ss.selStart = start;
ss.selEnd = end; if (mText instanceof Spanned) {
Spannable sp = new SpannableStringBuilder(mText); if (mEditor != null) {
removeMisspelledSpans(sp);
sp.removeSpan(mEditor.mSuggestionRangeSpan);
} ss.text = sp;
} else {
ss.text = mText.toString();
} if (isFocused() && start >= 0 && end >= 0) {
ss.frozenWithFocus = true;
} ss.error = getError(); if (mEditor != null) {
ss.editorState = mEditor.saveInstanceState();
}
return ss;
} return superState;
}
上面的方法中可以看出,TextView保存了自己的文本内容和选中的文本状态,这些内容在onRestoreInstanceState中会得到使用进行恢复。
接下来我们简单的讲下如何进行我们自己的数据保存呢?首先在我们的onSaveInstanceState方法中有个参数叫Bundle outState, 这个参数就是我们要使用的,他是可以进行数据携带的,我们只需要调用他的存储数据 outState.putString("extra_test" , "test"); 这样就将数据进行了存储,当activity异常销毁的时候会回调这个方法并且将这条数据存储起来,在重现启动时回调onRestoreInstanceState这个方法,他的参数也是Bundle savedInstanceState ,然后进行取出 String test = sacedInstanceState.getString("extra_test"); 就这样完成了。
注意的地方是,如果异常启动的时候 onCreate中也会有Bundle参数传回,同样可以在那里面进行恢复处理,但是由于onCreate方法在正常的情况下传回的Bundle参数为null,所以进行获取的时候需要进行判断,还是建议在onRestoreInstanceState方法中做这些事。
当然屏幕切换时可以禁止activity销毁重启的,只需要在全局配置清单中对应activity标签下加入:android:configChanges = "orientation"即可,此时屏幕旋转将不再销毁重启,也不会回调上述2个方法,但是会回调方法onConfigurationChanged方法,我们可以在这个方法中做相应的处理。注意这里的禁止并不是禁止横竖屏切换,而是当横竖屏切换时我们让activity不重启,如果要进行横竖屏切换禁止的话,需要添加如下参数 android:screenOrientation="portrait" 即可了。
以上就是对Activity的生命周期分析,如有疑问可留言,也可以留下你宝贵的意见。
Android开发艺术1之Activity的生命周期的更多相关文章
- Android开发学习之路--Activity之生命周期
其实这篇文章应该要在介绍Activity的时候写的,不过那个时候还不怎么熟悉Activity,还是在这里详细介绍下好了.还是参考下官方文档的图吧: 从上面的流程,我们可以看出首先就是打开APP,开始执 ...
- Android SDK上手指南:Activity与生命周期
Android SDK上手指南:Activity与生命周期 2013-12-26 15:26 核子可乐译 51CTO 字号:T | T Activity生命周期并不仅仅在用户运行应用程序之后才开始生效 ...
- Android艺术——深看Activity的生命周期
探究Activity的生命周期 1.典型情况下的生命周期分析:onCreate 初始化工作,加载布局资源和数据:onStart ac正在启动但是无法交互,后台:onResume ac可见,显示在前台: ...
- Android 横屏切换竖屏Activity的生命周期(转)
曾经遇到过一个面试题,让你写出横屏切换竖屏Activity的生命周期.现在给大家分析一下他切换时具体的生命周期是怎么样的: 1.新建一个Activity,并把各个生命周期打印出来 2.运行Acti ...
- Android开发艺术2之Activity的启动模式
Activity是Android的四大组件之一,他的重要性毋庸置疑,对于这么重要的一个组件,我们首先要知道这些都是由系统进行管理和回调的,要理解Activity的启动模式,我们首先来了解一下Andro ...
- Android Activity的生命周期简单总结
Android Activity的生命周期简单总结 这里的内容参考官方的文档,这篇文章的目的不是去总结Activity是如何启动,如何创造,以及暂停和销毁的,而是从实际开发中分析在Activity各个 ...
- android学习——activity的生命周期
Android中主要组件之Activity的生命周期,基本都是翻译Android API和个人的理解. 首先看一下Android api中所提供的Activity生命周期图: Activity其实是继 ...
- Android开发艺术探索读书笔记——01 Activity的生命周期
http://www.cnblogs.com/csonezp/p/5121142.html 新买了一本书,<Android开发艺术探索>.这本书算是一本进阶书籍,适合有一定安卓开发基础,做 ...
- Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式
Android开发艺术探索笔记--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activ ...
随机推荐
- 如何在网上得到你想要的图片,如logo
比如我们想得到网页:http://www.ahnu.edu.cn/里的安徽师范大学logo,可以这样做: 1.Ctrl+U,便进入了网页源代码页,也可以鼠标右键点"查看网页源代码" ...
- Ionicons的使用
安装 参考Ionicons npm install react-native-vector-icons --save 这时候可能会报错:npm WARN deprcated lodash@4.2.0: ...
- Linux系统(五)负载均衡LVS集群之DR模式
序言 DR模式是lvs集群中三种负载均衡模式的其中一种,那么上一篇中我写啦关于NAT模式的搭建与原理,为什么还要有DR模式与IP隧道模式呢? 首先我们来看3张图.LVS/NAT模式如下图: LVS/I ...
- 前端资讯周报 2.27 - 3.5: 如何设计一个优秀的HTML接口,深入理解line-height
从本周起,每周一我都会分享上一周我订阅的技术站点中,和解决问题的过程中阅读到的值得分享的文章,或者视频教程,又或者图书. 个人认为国外的技术文章质量较高,而且发布的技术资讯也走在行业前沿,所以比较关注 ...
- MySQL学习分享-->查询-->查询的分类
MySQL的查询可以分为交叉联接.内联接.外联接.自然联接.straight_join 下面对于查询的学习,会用到以下四张表: create table t_commodity_type( `id` ...
- js对象继承的问题
js继承方法有多种: 1.利用call()和apply()的方法. call()里面接受多个参数:apply()只能接受两个参数. call()第一个参数是本身,后面都是他的属性和方法. apply( ...
- image图片拉伸
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #1d9421 } p.p2 ...
- 使用IDEA的gradle整合spring+ mybatis 采用javaconfig配置
1.新建一个工程 2.工程目录 3.添加gradle.propertes文件 activeMQVersion=5.7.0 aspectJVersion=1.7.2 commonsLangVersion ...
- ajax 提交表单(文件)
废话不多说,自己看代码 引入的jquery <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js&quo ...
- 使用JSON.parse(),JSON.stringify()实现对对象的深拷贝
根据不包含引用对象的普通数组深拷贝得到启发,不拷贝引用对象,拷贝一个字符串会新辟一个新的存储地址,这样就切断了引用对象的指针联系. 测试例子: var test={ a:"ss", ...