`
weicaijin8
  • 浏览: 34260 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

android之 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,用户可能会被问那个组件被激活。如果没有目标找到,会产生一个异常。







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>,比如:

    <intent-filter>
    <action android:name="com.example.project.SHOW_CURRENT" />
    <action android:name="com.example.project.SHOW_RECENT" />
    <action android:name="com.example.project.SHOW_PENDING" />
    </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>子元素,比如:

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

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

3.数据测试

数据在<intent-filter>中的描述如下:

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

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

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



IntentFilter
简述:结构化描述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:xxx@abc.com"); 
   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, "me@abc.com"); 
   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={"me@abc.com"};   
   3. String[] ccs={"you@abc.com"};   
   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);
分享到:
评论

相关推荐

    Android使用Intent和Intentfilter进行通信

    在Android应用开发中,Intent和IntentFilter是两个至关重要的组件,它们构成了Android系统服务和组件之间通信的核心机制。本文将深入探讨Intent与IntentFilter的工作原理、使用方式以及它们在实际应用中的重要性。 ...

    Android 中IntentFilter的匹配规则实例详解

    "Android 中IntentFilter的匹配规则实例详解" Android 中IntentFilter 的匹配规则实例详解是一种核心机制,用于控制 ...通过了解 IntentFilter 的匹配规则,我们可以更好地使用 Intent 机制,实现更加复杂的应用程序。

    android桌面应用程序

    在 Android 桌面应用程序中,Home 分析目录是非常重要的组件之一,负责管理桌面上的图标、快捷方式、widget 等元素。Home 分析目录的主要功能包括: 1. 桌面图标管理:Home 分析目录负责管理桌面上的图标,包括添加...

    仿android市场多应用同时下载,通知栏通知.rar

    在Android平台上,实现多应用同时下载并展示通知栏通知是一项重要的功能,这使得用户可以方便地跟踪下载进度,且在后台进行多个应用的下载任务。本项目“仿android市场多应用同时下载,通知栏通知”就是一个这样的...

    android 跨应用程序广播发送接受

    在Android系统中,跨应用程序广播(Cross-App Broadcasting)是一种通信机制,允许应用程序之间传递消息,无需知道接收方确切的身份。这种机制对于组件间的解耦合以及系统事件的全局通知非常有用。本篇文章将深入...

    android基础应用介绍PPt

    **Android基础应用介绍** 在移动开发领域,Android操作系统占据着重要的地位,它是Google主导的开源项目,为开发者提供了丰富的API和工具,使得开发者能够构建出各种各样的应用程序。本PPT将带你走进Android基础...

    Intent和IntentFilter

    Intent 和 IntentFilter 是 Android 应用程序开发中的两个核心概念,它们构成了组件间通信的核心机制。Intent 可以被理解为一个信息载体,用于在不同的应用程序组件之间传递消息,而 IntentFilter 是一种声明机制,...

    Android平台下应用程序的四大构造体系.docx

    【Android平台下应用程序的四大构造体系】 Android应用程序的构建基于四大核心组件,它们分别是Activity、Intent Receiver、Service和Content Provider。这些组件共同构成了Android应用程序的基础框架,使得开发者...

    Android完全退出应用demo

    在Android开发中,完全退出应用程序通常指的是关闭所有与应用相关的活动(Activities)和释放系统资源。这不仅是用户体验的一部分,也可能在某些情况下是必要的,比如在内存紧张时优化系统性能。以下是一个关于如何...

    Android应用源码之Android 4.4.2 简单的人品测试.zip

    该压缩包文件“Android应用源码之Android 4.4.2 简单的人品测试.zip”包含了一个基于Android 4.4.2版本的简单应用的源代码,主要适用于Android开发者进行参考和学习。这个应用可能是一个人品测试的小程序,用于娱乐...

    Android应用框架原理与程序设计(简体中文版)

    框架层位于Linux内核之上,提供了用户界面、应用程序运行环境、硬件抽象层等关键功能。 2. **Activity管理**:Activity是Android应用的基本单元,代表用户可见的屏幕。书中会详细讲解Activity的生命周期、启动和...

    Android应用源码之CertInstaller.zip

    "Android应用源码之CertInstaller.zip"很可能是提供了一个用于在Android设备上安装证书的示例应用。这个源码可以帮助开发者理解和实现证书安装过程,确保应用程序能够正确地信任指定的SSL证书或CA(证书颁发机构)。...

    Android应用开机自动启动

    在Android系统中,应用通常不会在开机时自动启动,除非开发者特别设置了这个功能。这个功能在某些场景下非常有用,比如天气更新应用、消息推送服务等。本篇将详细讲解如何实现Android应用的开机自动启动。 一、...

    基于Android的嵌入式手机应用开发实训教程 电子教材及源码

    《基于Android的嵌入式手机应用开发实训教程》是一本专为学习Android嵌入式应用开发的电子教材,配合源码资源,旨在帮助读者深入理解并掌握在Android平台上进行手机应用开发的技术和实践方法。本教程涵盖了从基础...

    Android应用框架原理与程序设计(第三版)

    Android作为全球最流行的移动操作系统之一,其应用框架是开发者进行应用程序开发的基础。本书将带你探索以下几个关键知识点: 1. **Activity管理**:Activity是Android应用的基本组件,用于与用户交互。书中会详细...

    Android应用框架原理与程序设计.rar

    6. **IntentFilter与Intent**:Intent是Android中对象间通信的重要工具,IntentFilter则定义了对Intent的响应规则。理解这两者能帮助开发者实现组件间的灵活调用。 7. **Fragment**:Fragment是Android 3.0版本引入...

    Android应用源码之软件管理器.zip

    以下是对"Android应用源码之软件管理器.zip"中可能涉及的关键知识点的详细说明: 1. **Android应用架构**:Android应用基于组件模型,由Activity、Service、BroadcastReceiver和ContentProvider等构成。软件管理器...

    Android应用框架原理与程序设计

    《Android应用框架原理与程序设计》是一本深入探讨Android操作系统核心——应用框架的专著。在Android系统中,应用框架是开发者构建应用程序的基础,它定义了Android应用的生命周期、组件间交互以及与其他系统服务的...

    疯狂Android讲义源代码2

    第1章 Android应用与开发环境 1.1 Android的发展和历史 1.1.1 Android的发展和简介 1.1.2 Android平台架构及特性 1.2 搭建Android开发环境 1.2.1 下载和安装Android SDK 1.2.2 安装Eclipse和ADT插件 1.3 ...

    Android应用开发揭秘(源码)

    在Android应用开发的世界里,源码是学习和理解系统及应用工作原理的宝贵资源。"Android应用开发揭秘(源码)" 提供了深入洞察Android应用构建过程的机会,这对于初学者和有经验的开发者来说都是一个不可多得的学习资料...

Global site tag (gtag.js) - Google Analytics