IntentFilter

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

你可能感兴趣的:(IntentFilter)