zoukankan      html  css  js  c++  java
  • Intent 和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,用户可能会被问那个组件被激活。如果没有目标找到,会产生一个异常。

  • 相关阅读:
    研究生毕业论文如何选题
    关于虚拟机中开vmnet1(host)后pc不能上网的问题解决
    ubuntu10.04安装x264库
    CentOS 5.5无法识别Atheros AR8151网卡问题解决
    dm365工作笔记20130731
    DAVINCI DM365-DM368开发攻略——U-BOOT-2010.12及UBL的移植
    SQL语法练习
    T-SQL查询语句常用优化技巧总结
    【转】Asp.net控件开发学习笔记整理篇
    【转】Asp.net控件开发学习笔记整理篇
  • 原文地址:https://www.cnblogs.com/carbs/p/2571082.html
Copyright © 2011-2022 走看看