IntentFilter 中包含 action,category,data三种元素
一、Activity 调用模式有两种:
1、 显式调用:
它是明确的指出被启动的对象的组件信息,包括包名和类名。
例:通过包名打开另一个应用
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName("com.mg.axe.testappa","com.mg.axe.testappa.MainActivity");
intent.setComponent(cn);startActivity(intent);
。
例:打开通一个应用中的Activity
Intent intent = new Intent(ActivityA.this,ActivityB.class);
startActivity(intent);
(这种方式从严格上讲不算显示调用,因为显示调用的意义是 :需要明确的指出被启动的对象的组件信息,包括包名和类名,这里并没有指出包名 。)
2、 隐式调用:
通过匹配 IntentFilter 对应的过滤信息,来匹配出需要启动的Activity。如果匹出的Activity有多个,则显示一个列表 来让用户选择启动哪个Activity。
过滤条件就是:action,category,data三种元素
Intent intent = new Intent();
intent.setAction("android.intent.action.View");
startActivity(intent);
其中, action 和 category配合使用(category是action的附属信息),只有action匹配成功,同时category也匹配成功, 该Activity才算匹配成功。
- 可以匹配成功:
public void match(){
Intent intent = new Intent();
intent.addCategory("aaa.bb.cc");
intent.setAction("com.axe.mg.what");
startActivity(intent);
}
- 也能匹配成功,因为创建Intent的时候 不调用addCategory()方法,intent的category默认就会是 android.intent.category.DEFAULT
public void match(){
Intent intent = new Intent();
intent.setAction("com.axe.mg.what");
//不设置Category 默认是android.intent.category.DEFAULT匹配成功,action也匹配成功。
startActivity(intent);
}
- 只通过category匹配是无法匹配到AActivity的。因为category属性是一个执行Action的附加信息。
所以只靠category是无法匹配的。像如下代码
//没有setAction()无法匹配
public void match(){
Intent intent = new Intent();
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.addCategory("aaa.bb.cc");
startActivity(intent);
}
- data 单独使用
data属性包括:android:scheme、android:host、android:port、android:path、android:mimeType 几个部分。
data元素组成的URI模型如下:
scheme://host:port/path
其中host和port为URI的authority,如果没有指定host,port将被忽略
data的各属性并不是独立的,data的各属性构成了URI的整个组成部分。要使authority(host和port)有意义,必须指定scheme;要使path有意义,必须使scheme和authority(host和port)有意义。
Scheme:URI的模式。如果URI中没有指定Scheme.那么整个URI无效。默认值为content 和 file。
Host:URI的host。比如www.axe.com。如果指定了scheme和port,path等其他参数,但是host未指定,那么整个URI无效;如果只指定了scheme,没有指定host和其他参数,URI是有效的。可以这样理解:一个完整的URI :http://www.axe.com:500/profile/info 我将后面的prot 和path“:500/profile/info ”去掉,这个URI任然有效。如果我单独将www.axe.com 那这个URI就无效了。
Port:URI端口,当URI指定了scheme 和 host 参数时port参数才有意义。
path:用来匹配完整的路径,如:http://example.com/blog/abc.html,这里将 path 设置为 /blog/abc.html 才能够进行匹配;
pathPrefix: 用来匹配路径的开头部分,拿上面的 Uri 来说,这里将 pathPrefix 设置为 /blog 就能进行匹配了;
pathPattern: 用表达式来匹配整个路径。
一些实例:
- 只匹配scheme
- 只匹配 scheme host port
- 匹配 scheme host port path
- mineType匹配:
我们添加了mimeType。我们不能使用
setType 和 setData , 需要使用setDataAndType()。
setType() 会将URL设为null; setData()会将mineType设为null
public Intent setType(String type) {
mData = null;
mType = type;
return this;
}
public Intent setData(Uri data) {
mData = data;
mType = null;
return this;
}
正确匹配方式:setDataAndType()
public void match() {
Intent intent = new Intent();
//注意这个方法
intent.setDataAndType(Uri.parse("axe://www.axe.com:8888/mypath"),"axe/abc");
startActivity(intent);
}
总结:
隐式启动一个activity 可以使用Action (或者 Action和category)、也可以使用data进行过滤(data是进行反向限制Intent的,确定一个Activity的方法)。
在一个Activity的intent-filter中可以有多个action、多个category、多个data,这样可以有多种组合与Intent进行匹配。注意:如果在一个Activity中有多个Intent进行匹配的时候,建议使用多个intent-filter与Intent进行匹配。
常用Action和Category的意义
action:
- ACTION_MAIN:Android Application的入口,每个Android应用必须且只能包含一个此类型的Action声明。
- ACTION_VIEW:系统根据不同的Data类型,通过已注册的对应的应用显示数据。
- ACTION_DIAL:打开系统默认的拨号程序,如果Data中设置了电话号码,则自动在拨号程序中输入此号码。
- ACTION_CALL:直接呼叫Data中所带的号码。
Category:
CATEGORY_DEFAULT:Android系统中默认的执行方式,按照普通Activity的执行方式执行。
CATEGORY_HOME:设置该组件为Home Activity(Launcher桌面)。
CATEGORY_LAUNCHER 在桌面上显示图标。
- CATEGORY_BROWSABLE:设置该组件可以使用浏览器启动。
Data:
- tel://:号码数据格式,后跟电话号码。
- mailto://:邮件数据格式,后跟邮件收件人地址。
- smsto://:短信数据格式,后跟短信接收号码。
- smsto://:短息数据格式,后跟短信接收号码。
- 自定义data:
参考链接:
https://www.jianshu.com/p/5f644e0fdba9
https://blog.csdn.net/weihan1314/article/details/7973511