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方法,但是数据必须是基本类型或则实现了序列化接口的对象
activity启动模式
每个应用启动一个activity时都会把activity放入一个任务栈,app默认任务栈名字由taskAfinity属性决定,多任务可以通过设置FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_MULTIPLE_TASK实现
- standard 默认,不管任务栈有没有,每次创建一个activity对象,适用于一般普通页面
- singleTop 任务栈顶的activity和我们启动的activity是同一个类的时候,不重复创建对象,直接复用,并走onNewIntent()生命周期,反之要创建一个新对象,适用于activity自己启动自己的场景
- singleTask 任务栈内存在activity的类和我们要启动的activity类是同一个试,直接复用这个activity对象不再创建,走onNewIntent()生命周期,并且把这activity之上的activity全部清理出栈,intent设置FLAG_ACTIVITY_CLEAR_TOP可以达到相同作用,适用于应用首页场景
- singleInstance 整个任务栈只有一个activity对象,多次启动都只会在这单一的任务栈里复用这个单一的activity对象只执行onNewIntent()生命周期不再创建新的,适用于闹钟电话等全app唯一的系统应用场景