《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的优先级
可以通过设置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
- data由两部分组成,mimeType和URI.