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 = https://www.it610.com/article/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:

参考链接: 【IntentFilter】https://www.jianshu.com/p/5f644e0fdba9
https://blog.csdn.net/weihan1314/article/details/7973511

    推荐阅读