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 ...
随机推荐
- 如何一秒钟从头构建一个 ASP.NET Core 中间件
前言 其实地上本没有路,走的人多了,也便成了路. -- 鲁迅 就像上面鲁迅说的那样,其实在我们开发中间件的过程中,微软并没有制定一些策略或者文档来约束你如何编写一个中间件程序, 但是其中却存在者一些最 ...
- .CN根域名被攻击至瘫痪,谁之过?
2013-10-08 09:19 佚名 新浪科技 2013年8月25日凌晨,.CN域名凌晨出现大范围解析故障,经分析.CN的根域授权DNS全线故障,导致大面积.CN域名无法解析.事故造成大量以.cn和 ...
- WC2015 k小割(k短路+暴力+搜索)
首先这道题不是非同一般的恶心,三个数据层次对应三个程序= = PROBLEM:http://uoj.ac/problems解法: 1~2直接暴力枚举边的选择与否+判断就行了 7~14可以发现是一个平面 ...
- 每天一个linux命令(56)--crontab命令
上一节学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,Linux 系统则是由 cron(crond)这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个 ...
- php调用API支付接口(使用第三方接口,调用的天工接口。)
首先访问 https://charging.teegon.com/ 注册账号, 找到开发配置 记下client_id和client_secret. 点击 天工开放平台 点击天工收银 点击 S ...
- C# 字符串比较大小 string.Compare()方法
string.Compare方法,用来比较2个字符串值得大小 string.Compare(str1, str2, true); 返回值: 1 : str1大于str2 0 : str1等于str2 ...
- Omi应用md2site发布-markdown转网站利器
写在前面 Md2site是基于Omi的一款Markdown转网站工具,使用简单,生成的文件轻巧,功能强大. 当我们想把一堆markdown文档转成网站时,你可能有许多选择,倘若选择 md2site , ...
- TCP和UDP 的区别和适用场合
TCP和UDP式TCP/IP中能够实现传输层功能的.具有代表性的协议,其主要特点和区别如下: TCP: 面向连接的.可靠的流协议.为提供可靠性传输,TCP实行"顺序控制"或&quo ...
- 用DapperExtensions和反射来实现一个通用搜索
前言 搜索功能是一个很常用的功能,当然这个搜索不是指全文检索,是指网站的后台管理系统或ERP系统列表的搜索功能.常见做法一般就是在搜索栏上加上几个常用字段来搜索.代码可能一般这样实现 StringBu ...
- daterangepicker 时间插件
在工作中学习到的一种插件 上网查询之后发现 在bootstrap中的时间选择器有两种:dateTimePicker和dateRangePicker HTML <div id="repo ...