IntentFilter

 当Intent在组件间传递时,组件假设想告知Android系统自己可以响应和处理哪些Intent,那么就须要用到IntentFilter对象。

顾名思义,IntentFilter对象负责过滤掉组件无法响应和处理的Intent,仅仅将自己关心的Intent接收进来进行处理。 IntentFilter实行“白名单”管理,即仅仅列出组件乐意接受的Intent,但IntentFilter仅仅会过滤隐式Intent,显式的Intent会直接传送到目标组件。 Android组件能够有一个或多个IntentFilter,每一个IntentFilter之间相互独立,仅仅须要当中一个验证通过则可。除了用于过滤广播的IntentFilter能够在代码中创建外,其它的IntentFilter必须在AndroidManifest.xml文件里进行声明。

IntentFilter中具有和Intent相应的用于过滤Action,Data和Category的字段,一个隐式Intent要想被一个组件处理,必须通过这三个环节的检查。

一:检查 Action 虽然一个Intent仅仅能够设置一个Action,但一个Intentfilter能够持有一个或多个Action用于过滤,到达的Intent仅仅须要匹配当中一个Action就可以。 深入思考:假设一个Intentfilter没有设置Action的值,那么,不论什么一个Intent都不会被通过;反之,假设一个Intent对象没有设置Action值,那么它能通过全部的Intentfilter的Action检查。

二:检查 Data 同Action一样,Intentfilter中的Data部分也能够是一个或者多个,并且能够没有。每一个Data包括的内容为URL和数据类型,进行Data检查时主要也是对这两点进行比較,比較规则: 假设一个Intent对象没有设置Data,仅仅有Intentfilter也没有设置Data时才可通过检查。 假设一个Intent对象包括URI,但不包括数据类型:仅当Intentfilter也不指定数据类型,同一时候它们的URI匹配,才干通过检測。 假设一个Intent对象包括数据类型,但不包括URI:仅当Intentfilter也没指定URL,而仅仅包括数据类型且与Intent同样,才通过检測。
假设一个Intent对象既包括URI,也包括数据类型(或数据类型可以从URI判断出),仅仅有当其数据类型匹配Intentfilter中的数据类型,而且通过了URL检查时,该Intent对象才干通过检查。

当中URL由四部分组成:它有四个属性scheme、host、port、path相应于URI的每一个部分。

比如:content://com.wjr.example1:121/files

scheme部分:content

host部分:com.wjr.example1

port部分:121

path部分:files

host和port部分一起构成URI的凭据(authority),假设host没有指定,那port也会被忽略。

这四个属性是可选的,但他们之间并非全然独立的。要让authority有意义,scheme必需要指定。要让path有意思,scheme和authority必须指定。 Intentfilter中的path能够使用通配符来匹配path字段,Intent和Intentfilter都能够用通配符来指定MIME类型。

三:检查 Category Intentfilter中能够设置多个Category,Intent中也能够含有多个Category,仅仅有Intent中的全部Category都能匹配到Intentfilter中的Category,Intent才干通过检查。也就是说,假设Intent中的Category集合是Intentfilter中Category的集合的子集时,Intent才干通过检查。假设Intent中没有设置Category,则它能通过全部Intentfilter的Category检查。 假设一个Intent能够通过不止一个组件的Intentfilter,用户可能会被问那个组件被激活。假设没有目标找到,会产生一个异常。

应用程序的组件为了告诉Android自己能响应、处理哪些隐式Intent请求,能够声明一个甚至多个IntentFilter。每一个 IntentFilter描写叙述该组件所能响应Intent请求的能力——组件希望接收什么类型的请求行为,什么类型的请求数据。比方之前请求网页浏览器这 个样例中,网页浏览器程序的IntentFilter就应该声明它所希望接收的Intent Action是WEB_SEARCH_ACTION,以及与之相关的请求数据是网页地址URI格式。

怎样为组件声明自己的IntentFilter? 常见的方法是在AndroidManifest.xml文件里用属性<Intent-Filter>描写叙述组件的IntentFilter。

前面我们提到,隐式Intent和IntentFilter进行比較时的三要素是Intent的Action、Data以及Category。实际 上,一个隐式Intent请求要可以传递给目标组件,必要通过这三个方面的检查。假设不论什么一方面不匹配,Android都不会将该隐式Intent传递给 目标组件。接下来我们解说这三方面检查的详细规则。

1.动作測试

<intent-filter>元素中能够包含子元素<action>,比方:

  1. <intent-filter>
  2. <action android:name="com.example.project.SHOW_CURRENT" />
  3. <action android:name="com.example.project.SHOW_RECENT" />
  4. <action android:name="com.example.project.SHOW_PENDING" />
  5. </intent-filter>

一条<intent-filter>元素至少应该包括一个<action>,否则不论什么Intent请求都不能和该<intent-filter>匹配。

假设Intent请求的Action和<intent-filter>中个某一条<action>匹配,那么该Intent就通

过了这条<intent-filter>的动作測试。

假设Intent请求或<intent-filter>中没有说明详细的Action类型,那么会出现以下两种情况。

(1) 假设<intent-filter>中没有包括不论什么Action类型,那么不管什么Intent请求都无法和这条<intent-filter>匹配。

(2) 反之,假设Intent请求中没有设定Action类型,那么仅仅要<intent-filter>中包括有Action类型,这个Intent请求就将顺利地通过<intent-filter>的行为測试。

2.类别測试

<intent-filter>元素能够包括<category>子元素,比方:

  1. <intent-filter . . . >
  2. <category android:name="android.Intent.Category.DEFAULT" />
  3. <category android:name="android.Intent.Category.BROWSABLE" />
  4. </intent-filter>

仅仅有当Intent请求中全部的Category与组件中某一个IntentFilter 的<category>全然匹配时,才会让该Intent请求通过測试,IntentFilter中多余的<category> 声明并不会导致匹配失败。一个没有指定不论什么类别測试的IntentFilter仅仅仅仅会匹配没有设置类别的Intent请求。

3.数据測试

数据在<intent-filter>中的描写叙述例如以下:

  1. <intent-filter . . . >
  2. <data android:type="video/mpeg" android:scheme="http" . . . />
  3. <data android:type="audio/mpeg" android:scheme="http" . . . />
  4. </intent-filter>

<data>元素指定了希望接受的Intent请求的数据URI和数据类 型,URI被分成三部分来进行匹配:scheme、authority和path。当中,用setData()设定的Intent请求的URI数据类型和 scheme必须与IntentFilter中所指定的一致。若IntentFilter中还指定了authority或path,它们也须要相匹配才会 通过測试。

解说完Intent基本概念之后,接下来我们就使用Intent激活Android自带的电话拨号程序。通过这个实例你会发现,使用Intent并不像其概念描写叙述得那样难。

简述:结构化描写叙述intent匹配的信息。包括:action,categories and data(via type,scheme ,path),还有priority, to order multiple matching filters.

IntentFilter 中假设action为空,则视为通配符,假设type为空,则intent必须不设type,否则匹配不上。

data被分为3个属性:type,scheme,authority/path 不论什么设置的属性intent必须匹配上。

设置了scheme 而没设type,则intent也必须类似,不能设置type,也不能是content: URI.

设置了type而没设scheme:将匹配上没有URI的intent,或者content:,file:的uri。

设置了authority:必须指定一个或多个相关联的schemes

设置了path:唏嘘指定一个或多个相关联的schemes

匹配规则:

IntentFilter 匹配Intent的上的条件:

Action : 值同样 ,或则IntentFilter未指定action.

DataType:. 系统通过调用Intent.resolve(ContentResolver)获取type,通配符*

在Intent/IntentFilter的MIME type中使用,区分大写和小写

DataScheme:系统通过调用Intent. getData() and Uri.getScheme())获取scheme, 区分大写和小写

DataAuthority:必须有一个dataScheme匹配上且authority值匹配上,或者IntentFilter未定义。Intent. getData() and Uri.getAuthority()获取authority.

DataPath: scheme and authority必须先匹配上 ntent. getData() and Uri.getPath(),获取. 或者IntentFilter未定义

Categories:all of the categories in the Intent match categories given in the filter 多余的Categorie,不影响intent匹配,假设IntentFilter

没有指定Categorie,则仅仅能匹配上没有Categorie的intent。

经常使用intent列表:

Android Intent 使用方法汇总

显示网页

- <activity android:name="BrowserActivity" android:label="Browser" android:launchMode="singleTask" android:alwaysRetainTaskState="true" android:configChanges="orientation|keyboardHidden" android:theme="@style/BrowserTheme">

- <!--

For these schemes were not particular MIME type has been

supplied, we are a good candidate.

-->

- <intent-filter>

<action android:name="android.intent.action.VIEW" />

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

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

<data android:scheme="http" />

<data android:scheme="https" />

<data android:scheme="about" />

</intent-filter>

- <!--

For these schemes where any of these particular MIME types

have been supplied, we are a good candidate.

-->

- <intent-filter>

<action android:name="android.intent.action.VIEW" />

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

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

<data android:scheme="http" />

<data android:scheme="https" />

<data android:mimeType="text/html" />

<data android:mimeType="text/plain" />

<data android:mimeType="application/xhtml+xml" />

<data android:mimeType="application/vnd.wap.xhtml+xml" />

</intent-filter>

- <!--

We are also the main entry point of the browser.

-->

- <intent-filter>

<action android:name="android.intent.action.MAIN" />

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

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

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

</intent-filter>

- <intent-filter>

<action android:name="android.intent.action.WEB_SEARCH" />

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

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

<data android:scheme="" />

<data android:scheme="http" />

<data android:scheme="https" />

</intent-filter>

- <intent-filter>

<action android:name="android.intent.action.WEB_SEARCH" />

<action android:name="android.intent.action.MEDIA_SEARCH" />

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

</intent-filter>

- <intent-filter>

<action android:name="android.intent.action.SEARCH" />

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

</intent-filter>

<meta-data android:name="android.app.searchable" android:resource="@xml/searchable" />

- <intent-filter>

<action android:name="android.net.http.NETWORK_STATE" />

<action android:name="android.intent.action.PROXY_CHANGE" />

</intent-filter>

</activity>

1. Uri uri = Uri.parse("http://google.com");

2. Intent it = new Intent(Intent.ACTION_VIEW, uri);

3. startActivity(it);

显示地图

1. Uri uri = Uri.parse("geo:38.899533,-77.036476");

2. Intent it = new Intent(Intent.ACTION_VIEW, uri);

3. startActivity(it);

4. //其它 geo URI 範例

5. //geo:latitude,longitude

6. //geo:latitude,longitude?z=zoom

7. //geo:0,0?q=my+street+address

8. //geo:0,0?q=business+near+city

9. //google.streetview:cbll=lat,lng&cbp=1,yaw,,pitch,zoom&mz=mapZoom

路径规划

1. Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en");

2. Intent it = new Intent(Intent.ACTION_VIEW, uri);

3. startActivity(it);

4. //where startLat, startLng, endLat, endLng are a long with 6 decimals like: 50.123456

打电话

1. //叫出拨号程序

2. Uri uri = Uri.parse("tel:0800000123");

3. Intent it = new Intent(Intent.ACTION_DIAL, uri);

4. startActivity(it);

1. //直接打电话出去

2. Uri uri = Uri.parse("tel:0800000123");

3. Intent it = new Intent(Intent.ACTION_CALL, uri);

4. startActivity(it);

5. //用這個,要在 AndroidManifest.xml 中,加上

6. //<uses-permission id="android.permission.CALL_PHONE" />

传送SMS/MMS

1. //调用短信程序

2. Intent it = new Intent(Intent.ACTION_VIEW, uri);

3. it.putExtra("sms_body", "The SMS text");

4. it.setType("vnd.android-dir/mms-sms");

5. startActivity(it);

1. //传送消息

2. Uri uri = Uri.parse("smsto://0800000123");

3. Intent it = new Intent(Intent.ACTION_SENDTO, uri);

4. it.putExtra("sms_body", "The SMS text");

5. startActivity(it);

1. //传送 MMS

2. Uri uri = Uri.parse("content://media/external/images/media/23");

3. Intent it = new Intent(Intent.ACTION_SEND);

4. it.putExtra("sms_body", "some text");

5. it.putExtra(Intent.EXTRA_STREAM, uri);

6. it.setType("image/png");

7. startActivity(it);

传送 Email

1. Uri uri = Uri.parse("mailto:[email protected]");

2. Intent it = new Intent(Intent.ACTION_SENDTO, uri);

3. startActivity(it);

1. Intent it = new Intent(Intent.ACTION_SEND);

2. it.putExtra(Intent.EXTRA_EMAIL, "[email protected]");

3. it.putExtra(Intent.EXTRA_TEXT, "The email body text");

4. it.setType("text/plain");

5. startActivity(Intent.createChooser(it, "Choose Email Client"));

1. Intent it=new Intent(Intent.ACTION_SEND);

2. String[] tos={"[email protected]"};

3. String[] ccs={"[email protected]"};

4. it.putExtra(Intent.EXTRA_EMAIL, tos);

5. it.putExtra(Intent.EXTRA_CC, ccs);

6. it.putExtra(Intent.EXTRA_TEXT, "The email body text");

7. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");

8. it.setType("message/rfc822");

9. startActivity(Intent.createChooser(it, "Choose Email Client"));

1. //传送附件

2. Intent it = new Intent(Intent.ACTION_SEND);

3. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");

4. it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3");

5. sendIntent.setType("audio/mp3");

6. startActivity(Intent.createChooser(it, "Choose Email Client"));

播放多媒体

Uri uri = Uri.parse("file:///sdcard/song.mp3");

Intent it = new Intent(Intent.ACTION_VIEW, uri);

it.setType("audio/mp3");

startActivity(it);

Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");

Intent it = new Intent(Intent.ACTION_VIEW, uri);

startActivity(it);

Market 相关

1.        //寻找某个应用

2.        Uri uri = Uri.parse("market://search?q=pname:pkg_name");

3.        Intent it = new Intent(Intent.ACTION_VIEW, uri);

4.        startActivity(it);

5.        //where pkg_name is the full package path for an application

1.        //显示某个应用的相关信息

2.        Uri uri = Uri.parse("market://details?id=app_id");

3.        Intent it = new Intent(Intent.ACTION_VIEW, uri);

4.        startActivity(it);

5.        //where app_id is the application ID, find the ID

6.        //by clicking on your application on Market home

7.        //page, and notice the ID from the address bar

Uninstall 应用程序

1.        Uri uri = Uri.fromParts("package", strPackageName, null);

2.        Intent it = new Intent(Intent.ACTION_DELETE, uri);

3.        startActivity(it);

时间: 2024-10-11 07:56:16

IntentFilter的相关文章

Android Intent-Filter

1 package com.example.metrox.l10; 2 3 import android.content.Intent; 4 import android.net.Uri; 5 import android.support.v7.app.AppCompatActivity; 6 import android.os.Bundle; 7 import android.view.View; 8 9 public class MainActivity extends AppCompatA

Android中IntentFilter匹配规则详解——Android开发艺术探索笔记

欢迎转载,转载请注明出处http://blog.csdn.net/l664675249/article/details/50640288 启动Activity的方式分为两种,显示和隐式调用.显示调用很简单,直接指明要启动的Activity就可以了,这里主要介绍一下隐式调用.隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息.只有一个Intent同时匹配action,category和data才算匹配成功. 示例 <intent-filter> <acti

(备忘)android清单文件中&lt;meta-data&gt;标签,以及&lt;intent-filter&gt;下的&lt;data&gt;标签及其他标签

1.metadata可以写在application下也可以写在activity下,作为全局或activity内共享的数据 以键值对形式保存 <meta-data android:name="com.XXX.uuid" android:value="XXXX" /> 2.data标签是intent-filter的子标签,限定了intent的mimetype <data android:scheme="file" /> 3.&

安卓创建快捷方式相关问题 Intent Intent-filter

Intent 在安卓中,Activity启动时通常需要Intent参数.Intent参数中包含以下几个常用的属性: Component,指定了要启动的Activity,以及启动的context,使用Intent.setClass或Intent.setComponent方法可以设置: Action属性,可用Intent.setAction方法设置: Category属性,可用Intent.addCategory方法添加,Action和Category属性一般用于做过滤: Extra属性,用于传入一

Intent和IntentFilter的理解

<activity android:name=".SecondActivity"> <intent-filter> <action android:name="hello1" /> <action android:name="hello2" /> <category android:name="android.intent.category.DEFAULT" /> &

android-Intent and IntentFilter

一.Intent简介 Android使用Intent来封装程序的调用“意图”,Activity.Service.BroadcastReceiver三种重要的组件都是依靠Intent来启动的,很明显使用Intent提供了一致的编程模型:使用Intent还有一个好处是,在某些时候应用程序只是想启动具有某些特征组件,并不想和某个具体的组件耦合,如果使用形如startActivity(Class activityClass)的方法来启动特定的组件,势必造成一种硬编码耦合,这样也不利于高层次的解耦. 二.

[转]Intent和IntentFilter详解

Intent   Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用.Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互.因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦.在SDK中给出了I

android笔记--Intent和IntentFilter详解

Intent用于启动Activity, Service, 以及BroadcastReceiver三种组件, 同时还是组件之间通信的重要媒介. 使用Intent启动组件的优势1, Intent为组件的启动提供了一致的编程模型. 无论想要启动的组件是Activity, Service, 还是BroadcastReceiver, 都可以使用Intent封装启动的意图.2, 在某些时候, 应用程序只是想启动具有某种特征的组件, 并不想和某个特定的组件耦合. 使用Intent可以方便的达到这种高层次解耦的

Intent和IntentFilter详解

Intent用于启动Activity, Service, 以及BroadcastReceiver三种组件, 同时还是组件之间通信的重要媒介. 使用Intent启动组件的优势1, Intent为组件的启动提供了一致的编程模型. 无论想要启动的组件是Activity, Service, 还是BroadcastReceiver, 都可以使用Intent封装启动的意图.2, 在某些时候, 应用程序只是想启动具有某种特征的组件, 并不想和某个特定的组件耦合. 使用Intent可以方便的达到这种高层次解耦的