LaunchMode
四种启动模式:standard、singleTop、singleTask、singleInstance
standard
标准模式,系统默认的启动模式。每次启动一个Activity都会重新创建一个新的实例。在这种模式下,谁启动这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。
singleTop
栈顶复用模式,在这种模式下,如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数可以取出当前的请求信息。如果新的Activity实例已存在但不是位于栈顶,那么新的Activity仍然会被重新创建。
singleTask
栈内复用模式,在这种模式下,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,和singleTop一样,系统也会回调onNewIntent。
singleInstance
单实例模式,这是一种加强的singleTask模式,具备此模式的Activity只能单独位于一个任务栈中。
TaskAffinity
这个参数标识一个Activity所需要的任务栈的名字,默认情况下所有Activity所需的任务栈的名字是应用的包名。
TaskAffinity主要和singleTask启动模式或者allowTaskReparenting属性配对使用。
给Activity指定启动模式
1、通过AndroidMenifest为Activity指定启动模式;
2、通过在Intent中设置标志位。
这两种启动模式第二种的优先级高于第一种,当两种同时存在,以第二种为准;另外,两种方式在限定范围上有所不同,第一种无法直接为Activity设定FLAG_ACTIVITY_CLEAR_TOP标识,第二种不能指定singleInstance模式。
Activity的Flags
FLAG_ACTIVITY_NEW_TASK
为Activity指定singleTask启动模式,效果和XML中指定该启动模式相同。
FLAG_ACTIVITY_SINGLE_TOP
为Activity指定singleTop模式
FLAG_ACTIVITY_CLEAR_TOP
具有此标记的Activity,当它启动时,在同一任务栈中的所以位于它上面的Activity都要出栈,这种模式一般和FLAG_ACTIVITY_NEW_TASK配合使用。
IntentFilter的匹配规则
IntentFilter的过滤信息有action、category、data,action的匹配规则只要有一个action成功匹配就可以,category每个都要和过滤规则中的相同。
data由两部分最初,mineType和URI,mineType指媒体类型,如image/jpeg、video/*等,
URI结构:
1 | <scheme>://<host>:<port>/[<path>|[pathPrefix]|[pathPattern]] |
过滤规则中没有红的URI时默认content和file,也就是说,虽然没有指定URI,但是Intent的URI部分的scheme必须为content或者file才能匹配。