您的位置:首页 > 移动开发 > Android开发

《Android开发艺术》读书笔记之Activity的生命周期和启动

2016-01-25 00:00 288 查看

《Android开发艺术》读书笔记--Activity启动

###Activity启动生命周期的使用需要主要的要点

onStart与onResume的异同?
都表示Activity已经可见,但是onStart的时候Activity还在后台,onResume的时候Activity才显示到前台。

onPause的使用细节?
在该生命周期之中最好只做一些存储数据,停止动画等工作,但是注意不能太耗时,因为这会影响到新Activity的显示,onPause必须先执行完,新的Activity的onResume才能会执行。

####正常使用时的生命周期

一个特定的Activity启动:onCreate->onStart->onResume

当用户打开新的Activity或者切换到桌面时:onPause->onStop
如果新的Activity才用的透明主题,那么当前Activity不会调用onStop。

当用户再次回到原Activity时:onRestart->onStart->onResume

当用户按back键:onPause->onStop->onDestroy

总结:

对于整个生命周期来说:onCreate和onDestroy是配对的,分别标识着Activity的创建和销毁,并且只能调用一次。

对于Activity是否可见来说:onStart和onStop是配对的,这两个可能调用多次。

对于Activity是否在前台来说:onResume和onPause是配对的,这两可能调用多次。

当一个新的Activity被创建被显示的时候,旧的Activity先调用onPause,然后才调用新的Activity的onCreate->onStart->onResume,最后才会调用旧的Activity的onSop方法,所以不能再onPause中调用过于耗时的操作,否则会影响新的Activity的创建

###特殊情况下的生命周期

资源相关的系统配置发生改变导致Activity被杀死并重新创建

当系统配置发生改变时调用顺序:onSaveInstance->onPause->onStop->onDestroy

当Activity被重新创建的时候:onRestoreInstance->onCreate->onStart->...

资源不足导致低优先级的Activity被杀死

Activity的优先级

前台Activity--正在和用户交互的Activity,优先级最高

可见但非前台Activity--比如Activity中弹出一个对话框,导致Activity可见但是位于后台无法和用户直接交互

后台Activity--已经被暂停的Activity,比如执行了onStop,优先级最低

可以通过设置Activity的ConfigChanges属性,使Activity在配置发生改变的时候并不重新创建新的Activity。

###Activity的启动方法

Activity有四种启动模式:standard singleTop singTask singInstance

standard:默认模式,每次启动一个新的Activity都会重新创建一个新的实例,不管这个实例是否存在。

singTop:栈顶复用, 如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建。

singTask:栈内复用,只要一个Activity在一个栈中存在,那么无论调用多次此Activity都不会被重新创建。特殊地,如果需要的Activity存在于栈中,但是不在栈顶时,会清除栈中该Activity之前的Activity,即具有clearTop的效果。

singInstance:单实例模式,加强版的singTask,该模式下的Activity只能处于一个任务栈中。

关于任务栈的解释:

TaskAffinity:任务相关,这个参数标识了一个Activity所需要的任务栈的名字,默认情况下,所有的任务栈的名字为应用的包名。

allowTaskReparenting:迁移一个Activity到其他的任务栈。这个属性可以这样理解,现在有两个应用A和B,如果应用A启动了B的MainActivity,并且B的allowTaskReparenting被设置为true,那么当按home键退出MainActivity时,再按B应用的时候用直接到达MainActivity页面,而不是重新启动应用B,原因是:当A启动了B的MainActivity时,会查找自己所需要的任务栈,讲道理的话,这个Activity应该属于A任务栈中的,因为是被A启动的,但是该Activity属性allowTaskReparenting="true",那么该Activity就会重新创建一个属于应用B的任务栈,并从A任务栈中移动到B的所属任务栈。当启动任务B的时候,按道理,会重新创建一个B的任务栈,但是由于之前已经通过MainActivity创建过了,所以就不需要再次创建,直接执行栈中的页面就Ok了。这也就是allowTaskReparenting属性的特殊用法。

####Activity的Flags

FLAG_ACTIVITY_NEW_TASK:为Activity指定“singTask”启动模式,其效果和在XML中指定该模式相同。

FLAG_ACTIVITY_SINGLE_TOP:指定Activity为“singTop”模式。

###IntentFilter的匹配规则

#####匹配条件:

只有匹配了所有的action/category/data,才可以启动一个Activity,否则匹配失败。

一个Activity可以有多个intent-filter,一个Intent只能匹配任何一组intent-filter即可成功启动对应的Activity

#####名词解释:

action:是一个字符串,action的匹配规则是Intent中action必须和过滤规则中的action匹配,且和action字符串中的值完全一样。一个匹配规则可以有多个action,只要Intent中的过滤规则中任何一个相同即可匹配,区分大小写。

category:和action不同,它要求Intent中category必须包含于过滤规则中的每一个category。

data:如果过滤规则中定义了data,那么Intent中必须也要定义可匹配的data。

data由两部分组成,mimeType和URI.

mimeType:指媒体类型,比如image/jpeg等

URI:包含具体的媒体的地址,格式为
<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattrn>]
.

scheme:URI的模式,比如http/file

Host:URI的主机名。

Port:URI的端口号。

path/pathPattern/pathPrefix

匹配时,它要求Intent中必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: