zoukankan      html  css  js  c++  java
  • Intent和Intent Filter

    题记:这一节感觉比较抽象一点,嘿嘿,先纸上谈会兵,搞清楚下它们到底是个什么,又有什么作用,会用在哪,怎么用的。

    主要包括以下三个方面的内容:

    • Intent对象
    • Intent Filter
    • 二者的运作方式

    一、Intent对象

      感觉Intent对象是一个中介,它能够起到沟通三大核心组件的作用:activity,service,broadcast,实际上是一个抽象的数据结构,用来表示组件之间交互所需要的信息和数据。针对不同的组件,分别有不同的Intent实例对象,这样之间传递消息时,保证只传递到指定的那一类组件去。可以看作是一个信息的集合,包括了目标组件的信息和目标系统的信息。主要包括以下几类:

    • Component name:组件名称,用来指定Intent 目标匹配组件。可以是具体的类名,或者是包名(直接指向在manifest中定义该包名的应用)。该属性为可选,不一定非得设置。若不设置,则通过intent filter来匹配目标组件。两种方式的区别:前者是指定目标,用来匹配满足其指定条件的组件;后者就是目标本身的定义,用来被匹配。
    • Action:实际上就是一个具有一定格式的字符串,用来表示满足条件的动作或者已经触发的动作(广播)。使用时,直接通过setAction()方法或者getAction()方法来设置或者获取当前的action,一旦调用过setAction(),那么在实际请求过程中,会去intent filter中查找满足action的组件。
    • Data:就是Intent中携带的数据,只不过形式是URI或者MIME类型的,根据目标组件的不同而不同。方法包括:setData()和setType(),指向两种不同类型的数据形式。
    • Category:也是一个字符串形式的标识,用来标识目标intent必须满足的类型。
    • Extras:存放额外数据的,可以放置bundle数据以及一些状态等。
    • Flags:标志位,用来标识,具体标识什么,还不明白。

      Intent分为两大类:

    • Explicit Intents:目标清晰的Intent,通常指定了component name,也即目标。
    • Implicit Intents:不清晰的Intent,需要通过Intent Filter来匹配目标。

      Intent filter中必须会起作用的三大条件:action,category,data。

    二、Intent Filter

      按西瓜的理解就是,定义的筛选条件,当有请求过来的时候,按照一定的规则和筛选条件对component进行筛选,查找满足条件的,主要是对implicit intent起作用。匹配规则如下:

    • action节点:一个intent filter应该至少有一个action节点,否则的话任何intent过来都无法匹配上。当有多个action节点时,请求的intent只需要满足其中的一条就可以成功匹配上;
    • category节点:一个intent filter可以有多个category节点,当intent请求发送过来时,需要intent中的所有category要能在该intent filter下找到对应的category。当该节点不存在时,默认该项匹配通过。
    • date节点:匹配指定规则的URI或者MIME类型的数据。data中可以单独定义是匹配URI还是MIME,还是URI的一部分。当然,如果二者同时定义的话,需要同时满足才算成功通过匹配。比较模糊的地方在于:date节点即可以定义请求的intent数据格式,也可以看作成该component返回的数据格式,但是何时用作何种操作,怎么判断呢?

    三、二者的运作方式

      请求时传递Intent对象,然后由android 系统来解析这个intent对象,根据intent filter查找,满足intent中要求的目标组件是否存在。intent fileter不光能查找到目标组件,还能通过它来过滤出目标组件集合。原来正常应用程序界面上面展示的应用程序图标,都是系统通过"action:android.intent.action.MAIN"和"category:android.intent.category.LAUNCHER"这两个条件来查找到满足条件的application的。

    如有错误处敬请指正~~转载请说明出处

    看不清未来,那就看脚下。
  • 相关阅读:
    性能测试资源监控工具nmon使用方法
    Java用递归实现全排列,详细
    LaTeX新人使用教程[转载]
    计算机视觉论文分级
    如何用 tensorflow serving 部署服务
    Docker清除容器镜像命令:
    docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /tmp/tfserving/
    Invalid argument: Key: label. Data types don't match. Data type: int64 but expected type: float
    Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/usr/local/bin/tensorboard'
    tensorflow.python.framework.errors_impl.PermissionDeniedError: /data; Permission denied
  • 原文地址:https://www.cnblogs.com/caiwan/p/2887407.html
Copyright © 2011-2022 走看看