Android开发艺术探索1-activity的生命周期与启动模式

130 阅读2分钟

activity的生命周期

activity的启动模式

Standard:每次启动都会创建一个实例,不管这个实例是否存在

SingleTop:每次启动,如果栈顶有当前实例则不重新创建;否则进行重新创建添加至栈顶

SingleTask:每次启动,如果当前栈内有此实例,则不创建且将其实例以上清除出栈使得自己在栈顶

SingleInstance:加强版的singleTask,除了具有singleTask所有特性外,还有就是此种模式的activity只能单独的位于一个任务栈中,由于栈内复用、之后便不再创建相同实例

 

TaskAffinity:任务栈相关

默认的任务栈为包名

当TaskAffinity与singleTask配对使用时,待启动的activity会运行在名字和TaskAffinity相同的任务栈中

当TaskAffinity与allowTaskReparenting结合的时候,当一个应用A启动了应用B的某个activity后,如果这个allowTaskReparenting为true的话,那么当应用B被启动后,此activity会直接从应用A的任务栈转移到应用B任务栈中

 

Intent设置标志位来为Activity指定启动模式

这种方式优先于第一种;限定范围有所不同:第一种无法直接为activity设定FLAG_ACTIVITY_CLEAR_TOP标识,第二种无法指定SingleInstance模式

 

FLAG_ACTIVITY_NEW_TASK 效果与singleTask相同

FLAG_ACTIVITY_SINGLE_TOP 效果与singleTop相同

FLAG_ACTIVITY_CLEAR_TOP 与singleTask一起出现;如果与standard一起出现,那么它连同栈之上的activity都要出栈;然后创建新的实例入栈顶。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 具有这个标志的activity不会出现在列表中;等同于excludeFromRecents=true

 

IntentFilter的匹配规则

只有一个Intent同时匹配action类别、category类别、data类别才算完全匹配,只有完全匹配才能成功启动目标activity;一个Activity可以有多个intent-filter;一个Intent只要能匹配任何一组intent-filter即可成功启动对应activity

1、action的匹配规则:Intent中的action必须与过滤规则中的action匹配;如果Intent没有指定action,则匹配失败;action匹配要求Intent中的action存在且必须和过滤规则中的其中一个action相同。

2、要求Intent中如果含有category,那么所有的category必须和过滤规则中的其中一个category相同;Intent默认会加上DEFAULT这个category;所以为了接受隐私启动,在过滤规则中会加上DEFAULT

3、data的匹配规则与action类似;如果过滤规则中定义了data,那么Intent中必须也要定义可匹配的data。data由两部分组成:mimeType、URI;

它要求Intent中必须含有data数据,并且data必须完全匹配过滤规则中的某一个data;

匹配时,会检查是否成功的方法:resolveActivity;

决定应用程序的入口:

<action MAIN />

<category LAUNCHER />