IntentFilter

2018-09-26  本文已影响0人  feifei_fly

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才算匹配成功。

<activity
 android:name=".AActivity"
 android:label="@string/app_name"
 android:theme="@style/AppTheme.NoActionBar">
 <intent-filter>
 <category android:name = "android.intent.category.DEFAULT" />
 <category android:name="aaa.bb.cc"/>
 <action android:name="com.axe.mg.what" />
 </intent-filter>
</activity>

public void match(){
 Intent intent = new Intent();
 intent.addCategory("aaa.bb.cc");
 intent.setAction("com.axe.mg.what");
 startActivity(intent);
}

public void match(){
 Intent intent = new Intent();
 intent.setAction("com.axe.mg.what");
 //不设置Category 默认是android.intent.category.DEFAULT匹配成功,action也匹配成功。
 startActivity(intent);
}

//没有setAction()无法匹配
public void match(){
 Intent intent = new Intent();
 intent.addCategory(Intent.CATEGORY_DEFAULT);
 intent.addCategory("aaa.bb.cc");
 startActivity(intent);
}

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: 用表达式来匹配整个路径。

<data android:scheme="axe"
 android:host="axe"
 android:port="axe"
 android:path="axe"
 android:pathPattern="axe"
 android:pathPrefix="axe"
 android:mimeType="axe"/>

一些实例:

<activity
 android:name=".CActivity"
 android:label="@string/app_name"
 android:theme="@style/AppTheme.NoActionBar">
 <intent-filter>
 <action android:name="test" />
 <category android:name="android.intent.category.DEFAULT" />
 <data android:scheme="axe" />
 </intent-filter>
 </activity>
</application>

<activity
 android:name=".CActivity"
 android:label="@string/app_name"
 android:theme="@style/AppTheme.NoActionBar">
 <intent-filter>
 <action android:name="test" />
 <category android:name="android.intent.category.DEFAULT" />
 <data
 android:host="www.axe.com"
 android:port="8888"
 android:scheme="axe" />
 </intent-filter>
</activity>

<activity
 android:name=".CActivity"
 android:label="@string/app_name"
 android:theme="@style/AppTheme.NoActionBar">
 <intent-filter>
 <action android:name="xx" />
 <category android:name="android.intent.category.DEFAULT" />
 <data
 android:host="www.axe.com"
 android:path="/mypath"
 android:port="8888"
 android:scheme="axe" />
 </intent-filter>
</activity>

<activity
 android:name=".CActivity"
 android:label="@string/app_name"
 android:theme="@style/AppTheme.NoActionBar">
 <intent-filter>
 <action android:name="xx" />

 <category android:name="android.intent.category.DEFAULT" />
 <data
 android:mimeType="axe/abc"
 android:host="www.axe.com"
 android:path="/mypath"
 android:port="8888"
 android:scheme="axe" />
 </intent-filter>
</activity>

我们添加了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:

Category:

<category android:name="android.intent.category.LAUNCHER" />

Data:

 <data
    android:host="social"
    android:scheme="timo" />

参考链接:

https://www.jianshu.com/p/5f644e0fdba9
https://blog.csdn.net/weihan1314/article/details/7973511

上一篇 下一篇

猜你喜欢

热点阅读