component(显示启动)
设置启动目标包名类名,可通过intent的setClassName,setClass,setComponentName成员方法设置
Action,Category,Data,Type(隐式启动)
action和category以及Data和Type一般都是配合来隐式启动activity,可以和activity 具体包名类名解耦,type是辅助定义data类型的
action匹配规则:
- 接收方manifest可注册多个action
- 发送方intent要匹配只能设置接收方其中一个action
- actoin可是完全自定义字符
category 匹配规则:
- 接收方manifest可注册多个category
- 发送方intent可设置多个category,发送方所有category都属于接收方category子集才算匹配,发送方的category可以不写,默认会加上,接收方不能省
- 有些category必须要加上data,比如android.intent.category.BROWSABLE
- 必须设置和setAction一起才生效
data/type匹配规则:
- 接收方manifest设置一个data,发送方intent只能设置一个data,这个data要和收方注册一样则算匹配
- data 是 URI格式(<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>] )组成,最后面可以带额外的参数(?key1=value1 & key2 = value2)
- mimeType是描述data数据类型比如 image/jpeg、audio/mpeg4-generic、vidio/等
extra
放置额外的数据,activity之间数据通信一般通过这个putextra方法,但是数据必须是基本类型或则实现了序列化接口的对象
单个APP自己activity启动模式
standard 默认,不管任务栈有没有,每次创建一个activity对象,适用于一般普通页面
singleTop 任务栈顶的activity和我们启动的activity是同一个类的时候,不重复创建对象,直接复用,并走onNewIntent()生命周期,反之要创建一个新对象,适用于activity自己启动自己的场景
singleTask 任务栈内存在activity的类和我们要启动的activity类是同一个试,直接复用这个activity对象不再创建,走onNewIntent()生命周期,并且把这activity之上的activity全部清理出栈,intent设置FLAG_ACTIVITY_CLEAR_TOP可以达到相同作用,适用于应用首页场景
singleInstance 整个任务栈只有一个activity对象,多次启动都只会在这单一的任务栈里复用这个单一的activity对象只执行onNewIntent()生命周期不再创建新的,适用于闹钟电话等全app唯一的系统应用场景
上面四种模式是单个app,应用自己控制自己的Activity启动,如果是其他APP要控制另外一个APP的Activity启动模式,需要在java代码设置FLAG,请重点关注FLAG_ACTIVITY_NEW_TASK(原创~)
taskAffinity 任务栈名称,一般是应用包名,若要新建任务栈需要另起一个名并配合FLAG_ACTIVITY_NEW_TASK使用,在androidmanifest使用
FLAG_ACTIVITY_NEW_TASK 目的是启动activity到一个新的任务(Task)中,这个属性要特别注意用法:
1.多个APP情况下如果目标是singleTask或者singleInstance 单一设置了也是无效的,设不设置都会新起任务栈,目标activity配置taskAffinity为新的名称,可以新起一个不同于应用包名的任务栈,不配置taskAffinity则启动应用包名的任务栈(设置taskAffiinity为其他包名和不设置taskAffinity区别在于:设置了点击目标桌面图标时候还会有应用包名任务栈启动,这个时候目标APP就有俩个任务栈了)
2.多个APP情况下如果目标是standard或者singleTop,不设置不会新起一个任务栈,会在当前APP显示另一个APP的界面!设置了 这个flag会新起应用包名的任务栈,配置taskAffinity为其他包名可以新起一个不同于应用包名的任务栈,并且standard或者singleTop这种情况若目标task已存在,则不会创建activity,而是把task带到前台,要想创建目标activity,需要两个以上的FLAG:FLAG_ACTIVITY_NEW_TASK或加FLAG_ACTIVITY_CLEAR_TOP或FLAG_ACTIVITY_MULTIPLE_TASK,参考google注解:
When using this flag, if a task is already running for the activity you are now starting, then a new activity will not be started; instead, the current task will simply be brought to the front of the screen with the state it was last in. See FLAG_ACTIVITY_MULTIPLE_TASK for a flag to disable this behaviorFLAG_ACTIVITY_MULTIPLE_TASK,配合FLAG_ACTIVITY_NEW_TASK,不停启动的话会创建无数个task
FLAG_ACTIVITY_CLEAR_TASK,如果Intent中设置了这个标志,会导致含有待启动Activity的Task在Activity被启动前清空。也就是说,这个Activity会成为一个新的root,并且所有旧的activity都被finish掉。这个标志只能与FLAG_ACTIVITY_NEW_TASK 一起使用。
FLAG_ACTIVITY_SINGLE_TOP 如果要启动的 Activity 已经位于任务栈的顶部,那么系统不会重新创建这个 Activity,而是会调用该 Activity 的onNewIntent方法,类似manifest里面设置singletop
FLAG_ACTIVITY_CLEAR_TOP果要启动的 Activity 已经在任务栈中存在,使用这个标志会清除该 Activity 之上的所有其他 Activity,然后将这个 Activity 置于栈顶,类似manifest里面设置singleTask
FLAG_ACTIVITY_NO_HISTORY当 Activity 被启动时带有这个标志,系统在该 Activity 停止后(例如用户按下返回键),不会将其保留在任务栈中
其他的FLAG需要的网上自己查吧比较简单和统一了,重点理解FLAG_ACTIVITY_NEW_TASK+taskAffinity