您的位置:首页 > 其它

安卓开发艺术探索 笔记1

2016-04-06 18:58 246 查看
最近刚买的新书,打算好好看的,平时太懒,希望这次能够克服一下这个老毛病,好记性不如烂笔头。

第一章 Activity的生命周期和启动模式

1.1  Activity 的生命周期全面分析

1.1.1 典型情况下的生命周期分析

onCreate:可以在这里做一些初始化工作

onRestart:一般当前的activity从不可见重新变为可见状态时,就会调用它

onStart:这个时候可以理解为,Activity已经显示出来了,但是我们看不到

onResume:同样Activity可见了,且显示到了前台,而onStart依旧在后台

onPause:正在停止,紧接着onstop就会被调用//可以做一些存储数据等轻量级的工作,因为onpause必须先执行完,新的activity的onresume才会执行。

onstop:表示activity即将停止,这个时候可以做作一些重量级的回收工作,同样不能太耗时

ondestory。。。

正常情况下activity的常用生命周期只有上面的七个。对于各种的切换过程其实也不难,可以自己去查阅相关资料。

onstart和onstop是从activity 是否可见的角度来回调,而on resume和on pause是从activity是否位于前台的角度来回调的,除了这个区别,在实际使用过程中也没有其他明显的区别

1.1.2 异常情况下的生命周期

情况1:资源配置发生改变导致actvity被杀死并重新创建

比如说横竖屏的变换,在默认情况下ac就会被销毁并且重新创建,当然我们也可以阻止系统重新创建文明的ac。

在默认的情况下,文明不做任何处理那么的那个系统配置发生改变时,ac就会被销毁并且重新创建。onpause,onstop,ondestory均会被调用了

因为是异常情况下的终止,所以会调用onsaveinstancestate来保存当前的ac的状态,这个方法一般在onstop之前调用,和onpause之间没有既定的时序关系

并且把保存的bundle对象作为参数同时传给onrestoreinstancestate和increate方法。所以我们可以通过这两个方法来判断ac是否被重键了,如果重建了句去取出之前保存的值,在oncareate方法里取值的时候需要判断savedinstance是否为空,而在onrestoreinstancestate里就不要。从时序上来讲,onrestoreinstancestate的调用时间是在onstart之后。

可以简单的理解,只有ac异常终止,才会调用onsavesintancestate和onrestoreinstancestate来存储和恢复数据。

情况2.资源内存不足导致低优先级的ac被杀死

ac按照优先级从高到低可以分为如下3种:

前台ac:正在和用户交互的

可见但非前台ac:比如弹出一个对话框,导致ac可见但位于后台无法和用户交互。

后台ac:已经被暂停的,比如执行onstop的,优先级最低。

上面分析了数据存储盒恢复机制,我们知道当系统配置发生改变后,ac就会被重新创建。那么有没有方法不重建呢,当然有

我们可以给ac指定configchanges属性。。。在manifest.xml文件里加入声明即可。

1.2 ac的启动模式

总共分为4种:

standard:系统的默认模式

singletop:栈顶复用模式

singletask:栈内复用模式,在这个启动模式中,我们提到了ac所需要的任务栈,这里要说到一个参数:taskaffinity可以翻译为任务相关性,标识了ac所需要的任务栈的名字,当我启动一个新的ac时候,会新建一个栈,这个栈的名字就可以以此命名。

singlesinstance:单实例模式

具体之间的区别我想大家也应该都清楚,这里就不一一赘述。面试经常会问哦。

如何给ac指定启动模式呢:

在menifest文件里:

通过在intent中设置标志位来指定,也就是i.addFlags()...

1.3 IntenFilter的匹配规则

我们知道启动ac的方式有两种,显示调用和隐式调用。

显示调用很简单,直接指定。

下面介绍一下隐式调用。

隐式调用需要intent能够匹配目标组建的intenfilter中所设置的信息。如果不匹配将无法启动目标ac。

常用的intentfilter过滤信息有action,category,data。。

1.action匹配规则

2.category匹配规则:要有默认的category声明。

3.data匹配规则:data由两部分组成,mimetype:指媒体类型,URL包含的数据就比较多了,具体可以百度查阅。默认的uri为content 和file。

如果intent要指定完整的data就必须调用setdataandtype方法,因为两个单独的方法会清除彼此。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: