了解 uri, content provide,包括 data android:host,android:scheme(转)

本文深入探讨了在Android平台下,如何使用URI与ContentProvider实现应用程序间的数据共享。从URI的基本概念出发,阐述了其在标识ContentProvider及数据库表中的作用,并详细介绍了如何通过ContentUris和Uri操作来标识特定资源。文章旨在帮助开发者掌握这一核心共享数据技术,提升应用间的协同效率。
Keywords: content provider, URI
Content Provider这个东西在Android平台上是最常用的共享数据的方法(似乎应用程序之间共享数据也只有这种方法吧,待求证)。虽然常用,但是这个东 西要理解透彻还是要先掌握一些基础的。URI就是Content Provider(简称CP)的基础。我们要标识一个CP,就必须用URI这个东东。这就类似于我们要通过网址来标识某个特定网站,实际上网址URL本身 就是一种URI。URI全称Uniform Resource Identifier, 它包括了URL和URN。而关于它们的详细解释,有心的朋友可以参考RFC3896:http://tools.ietf.org/html /rfc3986。URI不仅可以标识特定CP,还可以标识CP中特定的数据库表,就好像URL不仅可以标识特定网站,也可以标识这个网站某个特定网页一 样。实际上在Android平台上URI的用途更广泛一些,它还用于Intent中data的标识。
就Android平台而言,URI主要分三个部分:scheme, authority and path。其中authority又分为host和port。格式如下:
scheme://host:port/path
举个实际的例子:
content://com.example.project:200/folder/subfolder/etc
\---------/ \---------------------------/ \---/ \--------------------------/
scheme host port path
\--------------------------------/
authority

现在大家应该知道data flag中那些属性的含义了吧,看下data flag
<data android:host="string"
android:mimeType="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:port="string"
android:scheme="string" />
但是我们在程序中一般是不直接用URI来标识CP的,是的,正如我们通常见到的用定义的常量来标识。例如standard CP中的Contacts,我们就用Contacts.People.CONTENT_URI来标识Contacts CP中People这个表。那么要标识某个具体的人怎么办呢? 这就用到了ContentUris.withAppendedId() 和 Uri.withAppendedPath()。例如我们要表示content://contacts/people/20,那么我们就可以用如下语句:
Uri uri = ContentUris.withAppendedId(People.CONTENT_URI, 20); 或者
Uri uri = Uri.withAppendedPath(People.CONTENT_URI, "20");
### Android 中 `<data>` 标签的 `scheme` 和 `host` 属性配置 在 Android 的 `<data>` 标签中,`scheme` 和 `host` 属性用于定义 URI 的模式和主机部分。以下是关于这两个属性的详细说明: #### 1. `scheme` 属性 `scheme` 属性指定了 URI 的协议部分。例如,在 `http://example.com` 中,`http` 是 scheme。在 Android 中,`scheme` 常用于定义自定义协议或标准协议(如 `http` 或 `https`)。通过设置 `scheme`,可以限定 Intent 匹配特定的协议[^1]。 ```xml <data android:scheme="http" /> ``` #### 2. `host` 属性 `host` 属性指定了 URI 的主机部分。例如,在 `http://example.com/path` 中,`example.com` 是 host。通过设置 `host`,可以进一步限定 Intent 匹配特定的主机地址[^1]。 ```xml <data android:host="example.com" /> ``` #### 3. 组合使用 `scheme` 和 `host` 为了更精确地匹配 URI,通常会同时设置 `scheme` 和 `host` 属性。例如,以下配置将匹配所有以 `http://example.com` 开头的 URI: ```xml <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" android:host="example.com" /> </intent-filter> ``` #### 4. 配置示例:`xhsdiscover` 和 `rn` 如果需要配置一个自定义的 `scheme` 和 `host`,例如 `xhsdiscover` 和 `rn`,可以按照以下方式设置: ```xml <data android:scheme="xhsdiscover" android:host="rn" /> ``` 这将匹配所有以 `xhsdiscover://rn/...` 开头的 URI。 #### 5. 注意事项 - 如果未指定 `scheme`,则默认匹配所有协议。 - 如果未指定 `host`,则默认匹配所有主机。 - 可以通过添加其他属性(如 `path`、`port` 等)进一步细化匹配规则。 ```xml <data android:scheme="xhsdiscover" android:host="rn" android:path="/some/path" /> ``` 以上配置将匹配 `xhsdiscover://rn/some/path`。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值