Activity生命周期
activity的生命周期,大家都应该比较熟悉。一起来回顾下吧。
- 如果新activity采用了透明主题,那么当前activity不会回调onstop。
- 当前activity为a,这时打开activity b,那么b的onresume和a的onpause哪个先执行呢?通过源码发现和打印log,a的onpause需要先执行,b的onresume才能执行。
onpause和onresume不能做过重的操作,onstop可以做稍微复杂点的操作。
activity启动模式
四种启动模式:standard,singleTop,singleTask,singleInstance.
singleTop模式:如果这个activity已经位于任务栈的栈顶,那么这个activity不会被重新创建,它的onNewIntent方法会被调用,但是oncreate,onstart不会被调用,因为它并没有改变。
singleTask模式:比如目前任务栈中的情况为abc,这个时候d以singletask模式请求启动,其所需要的任务栈为s2,由于s2和d的实例均不存在,所以系统会先创建任务栈s2,然后再创建d的实例并将其放入s2中。
- 假如d所需要的任务栈为s1,其他情况上面和上面一样,那么因为s1已经存在了,所以系统会直接创建d的实例并将其放入s1.
如果d所需的任务栈为s1,并且s1的情况为adbc,这时d不会重新创建,而是会移到栈顶,并且把他上面的都clearTop,于是最终留下ad两个实例。
singleInstance:这个模式会重新创建一个新的任务栈,只有它一个实例,后续不会有新的activity在这个栈中。
intentFilter的匹配规则
隐式匹配需要intentFilter过滤,过滤信息有action,category,data.一个过滤列表中的action,category和data可以有多个,一个activity中可以有多个intent-filter,只要能匹配任何一组intent-filter即可成功启动对应的activity。
action的匹配规则
action的匹配要求intent中的action存在且必须和过滤规则中的其中一个action相同,而且action区分大小写,大小写不同字符串相同的action会匹配失败。
category的匹配规则
Intent中可以没有category,如果没有category的话,也可以隐式启动。如果有category(可以有多个),那所有的category必须和filter中的category都相同。
data的匹配规则
data和action类似,如果filter中定义了data,那么intent中必须也要定义可匹配的data。data由两部分组成,mimeType和URI。mimeType指媒体类型比如图片,文本,视频等媒体格式。uri中包含://:/[/[||]],哎呀好麻烦,其实就是这样:http://www.baidu.com:80/search/info或者content://com.example.project:200/folder/subfolder/etc
还有一点需要注意:setData和setType会彼此清除对方的值,所以直接用setDataAndType方法。
隐式启动要判断下有没有这个activity,否则会出现错误