参考链接:http://blog.youkuaiyun.com/mynameishuangshuai/article/details/51673273
启动activity 、 service、IntentReceiver的时候可以是显式启动,也可以是隐式。
显式启动Intent intent = new Intent(MainActivit.this, NewActivity.class);
startActivity(intent );
隐式启动
intent的发送这并不关心接收者是谁,有利于intent 发送者合接受者之间的解耦
1:action匹配规则:
intent中只能设置一个action, intent-filter 中可以设置多个action
intent中设置action的的方法有两种: 1、new Intent(“action字符串”); 2、intent.setAction(“action字符串”);
action字符串可以是系统的也可以是自定义的(一般是包名结构.常量)
只要 intent-filter 中包含了intent中的action,就代表这个intent匹配成功
2:data的匹配规则
data的匹配规则合action的类似,它也要求intent中必须含有data数据,并且data数据能够完全匹配过滤规则钟的某一个data,这里的完全匹配是指过滤规则中出现的data部分也出现在intent的data中。
data由两部分组成:MineType 和 URI
MineType指的是媒体类型,例如imgage/jpeg,auto/mpeg4和viedo/*等,可以表示图片、文本、视频等不同的媒体格式
uri则由scheme、host、port、path | pathPattern | pathPrefix这4部分组成
需要注意的是:若Intent Filter的data声明部分未指定uri,则缺省uri为content或file,Intent中的uri的scheme部分需为content或 file才能匹配;若要为Intent指定完整的data,必须用setDataAndType方法,究其原因在,setData和setType方法的 源码中我们发现:
public Intent setData(Uri data) {
mData = data;
mType = null;
return this;
}
public Intent setType(String type) {
mData = null;
mType = type;
return this;
}
3:category匹配规则
intent可以有0~n个,如果不设置则系统会默认添加一个android.intent.category.DEFAULT
intent-filter 中可以设置多个category
category要求Intent可以没有category,但是一旦发现存在category,不论你有多少,每个都要能够和过滤规则中的任何一个category相同,是包含和被包含的关系
附录:
查询是否有Activity可以匹配我们指定Intent的组件
采用PackageManager的resolveActivity或者Intent的resolveActivity方法会获得最适合Intent的一个Activity
调用PackageManager的queryIntentActivities会返回所有成功匹配Intent的Activity