intent 学习小记

对 android 有点理解的人都知道 Intent,它用于在几大组件之间传递数据。针对谷歌文档上对 Intent 的说明,特总结如下。

1. Intent 中可以包含六种数据:

1)。 Component Name。Component Name 由类名( full-qualified ) 和 包名组成。

2)。 Action :一个 Intent 只能携带一种类型的 action。

3)。 Category : 一个 Intent 可以携带任意种 category。

4)。 Extras:Intent 把各种类型的 extras 其实都放到了一个 Bundle 对象中,可以通过 getExtras 获取该对象。

5)。 Flags

6)。 Data。Data 包括两部分:URI 和 Type。

说一下 URI 。URI = scheme://host:port/path。也就是说,一个 URI 可以有 scheme,host,port,path 四部分。

host 和 port 组成了一个 URI 的 authority。如果一个 URI 没有 host 部分,那么即使它有 port 部分也会被忽略。

对于一个 URI 来说,四部分都是可选的(可有可无),但是这四部分之间不是互相独立的,有依赖关系。如果想要一个 URI 的 authority 部分有意义,必须说明它的 scheme 部分;如果想要一个 URI 的 path 部分有意义,必须说明它的 scheme 和 authority。


对于一个 Intent 对象,以上六种数据都是可选的(可有可无)。如果想包含Data 部分的话,URI 和 Type,可以都有,可以都没有,也可以只有任意一个,随意。


2. Intent 作用

两个:主要是用来在组件之间传递数据,也可以用来查找符合条件的组件(如 PackageManager 中的各种 query。。。 方法)。


3. Intent 的匹配规则

Intent 在传递数据的时候,需要和 Intent-filter 匹配,来确定某个组件是否可以接收该 Intent。Intent-filter 不多介绍,可以看文档。在 Intent 可以携带的六种数据中,只有 Action,Category 和 Data 可以用于匹配。并且每次在匹配的时候,都会去把这三个元素挨着匹配一遍,不管 Intent-filter 里面是否是否声明了该元素。这三种元素都有自己的匹配规则。

下面详细说下各种类型的匹配规则(要想通过一个 Intent-filter ,必须通过它列出的所有类型的条件):

1)。Action

一个 Intent-filter 必须至少具有一个 <action> 元素,否则它会不接收任何隐式 Intent.

一个没有携带 action 的 Intent 可以通过任何列出了 <action> 元素的 Intent-filter。

一般情况下,就是 Intent 携带的 action 和 Intent-filter 列出的 <action> 能匹配上就行。Intent-filter 可以列多个 <action>,Intent 携带的和其中一个匹配就行。

2)。Category

一个 Intent 想要通过 category 的检查,那么该 Intent 携带的每一种 category 都必须匹配到一个在 Intent-filter 中列出的 <category> 元素。所以

一个没有携带 category 信息的 Intent 可以通过任何 Intent-filter 的检查(尽在 category 这一项的检查中)。这里有一个例外,就是被传递给 startActivity 的 Intent 默认携带一个 Category_DEFAULT 的 category,所以要是希望一个 activity 可以接受隐式 Intent,那么在它的 Intent-filter 中至少要有一个 Category_DEFAULT 的元素。这里也有一个例外,那就是作为一个 task 的入口点的 activity,就是在 Intent-filter 中列出了 Action_MAIN 和 Category_LAUNCHER 的actvity,在他们的 Intent-filter 中默认提供一个 Category_DEFAULT,所以在这一类 activity 的 Intent-filter 中写不写 Category_DEFAULT 都行。

3)。Data

上文说了,Data 包含两部分:URI 和 Type。也得分开说。

不包含 Data 的 Intent 只可以通过 不包含 Data 的 Intent-filter 的检查。

包含 URI 而不包含 Type(从 URI 也不能得到某种Type) 的 Intent 只可以通过 包含相同的 URI 并且也不包含 Type 的 Intent-filter.

包含 Type 而不包含 URI 的 Intent 只可以通过 包含相同的 Type 并且也不包含 URI 的 Intent-filter.

一个既包含 URI 又包含 Type(或者从 URI 能得到某种Type) 的 Intent 可以通过和它所包含的 URI 相同并且 Type 也相同的 Intent-filter。当该 Intent 包含的 URI 是 content: 或者 file:,而 Intent-filter 没有包含 URI 信息时,也可以通过。因为一个组件默认支持URI为 content: 或者 file: 类型的数据(如果没有在 Intent-filter 中显示说明它支持的 URI 的话)。


在看谷歌文档时看到的一些需要注意的信息:

1)。一个 activity 可以通过 setResult 来返回信息给那个通过 startActivityForResult 启动它的 activity。

2)。每次通过 startService 启动 service,都会执行该 service 中的 onStartCommand 函数。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值