首页 > 代码库 > Android开发-API指南-<provider>

Android开发-API指南-<provider>

<provider>

英文原文:http://developer.android.com/guide/topics/manifest/provider-element.html
采集(更新)日期:2014-7-1
搬迁自原博客:http://blog.sina.com.cn/s/blog_48d491300100zmv5.html

语法:
<provider android:authorities="list"          android:enabled=["true" | "false"]          android:exported=["true" | "false"]          android:grantUriPermissions=["true" | "false"]          android:icon="drawable resource"          android:initOrder="integer"          android:label="string resource"          android:multiprocess=["true" | "false"]          android:name="string"          android:permission="string"          android:process="string"          android:readPermission="string"          android:syncable=["true" | "false"]          android:writePermission="string" >    . . .</provider>
包含于:
<application>
可包含:
<meta-data>
<grant-uri-permission>
<path-permission>
说明:
声明一个 Content Provider 组件。Content Provider 是ContentProvider的子类,它为应用程序管理的数据提供结构化的访问方式。应用程序的所有 Content Provider 都必须在 Manifest 文件的 <provider> 元素中定义,否则,系统是不予理会也不会去运行 Content Provider 的。

只需要声明本应用程序所含的 Content Provider 即可。属于其他应用程序而本程序会用到的 Content Provider 不需要进行声明。

Android 系统用 content URIauthority 部分来存放对 Content Provider 的引用。例如,假定要访问存储了医务人员信息的 Content Provider 。这里调用了ContentResolver.query()方法,以下 URI 作为参数之一标明了 Content Provider:

content://com.example.project.healthcareprovider/nurses/rn

content: scheme 部分标明了这是一条指向 Android Content Provider 的 URI 。 authority 部分 com.example.project.healthcareprovider 标明了 Content Provider 本身。 Android 系统会在已知的 Provider 和 authority 清单中查找该 authority 信息 。 字符串 nurses/rn 是路径信息,Content Provider 可以用它来标识数据的某个部分。

注意,当在 <provider> 元素中定义 Content Provider 时, 请不要在 android:name 中包含 scheme 及路径信息,只要 authority 就可以了。

关于开发和使用 Content Provider 的详细信息,请参阅 API 指南 Content Provider。

属性:
android:authorities
一个或多个 URI authority 列表,标识了 Content Provider 内提供的数据。 多个 authority 名称之间用分号分隔。 为了避免冲突, authority 名称应该使用 Java 风格的命名规则(比如 com.example.provider.cartoonprovider)。 一般来说,它是实现 Content Provider 的 ContentProvider 子类名。

没有默认值。至少必须指定一个 authority 。

android:enabled
Content Provider 能否被系统实例化 — “true”可以,“false”不允许。 默认值是“true”。

<application>元素拥有自己的 enabled 属性,适用于应用程序所有内部组件,包括 Content Provider 。 要允许内容提供器的使用, <application> <provider> 的该属性都必须设置为“true”(均为默认值即可)。 如果其中任何一个为“false”,则该 Content Provider 将被禁用,它将不能被实例化。

android:exported
本 Content Provider 能否被其他应用程序使用:
  • true”:可以。 任何应用程序都可以通过 URI 访问本 Content Provider,且受限于 Content Provider 声明的权限要求。
  • false”:不可以。 通过设置 android:exported="false",可以限制对本应用程序中的 Content Provider 进行。 只有那些用户 ID 相同的应用程序才能访问到它。

对于 android:minSdkVersionandroid:targetSdkVersion 小于等于"16"的应用程序,默认值是“true”。 对于这两个属性值为"17"以上的应用程序,默认值为"false"

android:grantUriPermissions
是否能临时超越 readPermissionwritePermissionpermission 属性的限制, 给平常无权对 Content Provider 数据的访问进行授权 — “true”可以授权,“false”不可以。 如果设为“true”,则可对 Content Provider 的所有数据进行授权访问。 如果设为“false”,那就只能对 <grant-uri-permission> 子元素中列出的数据子集(假如存在的话)进行授权。 默认值是“false”。

授权机制使得程序组件能对那些受权限保护的数据进行一次性的访问。 比如,假定某条 e-mail 包含了附件,邮件程序可能会调用合适的查看器来打开附件,即使该查看器平常无权查看 Content Provider 的全部数据也没关系。

这时候,可以通过设置启动组件的 Intent 对象的 FLAG_GRANT_READ_URI_PERMISSIONFLAG_GRANT_WRITE_URI_PERMISSION 标志位进行授权。 比如,邮件程序可以在传入 Context.startActivity() 的 Intent 中设置 FLAG_GRANT_READ_URI_PERMISSION。 权限即指定授予该 Intent 中的 URI。

如果启用了这种临时授权的特性,不论是将本属性设为“true”还是定义了 <grant-uri-permission> 子元素,那么当所涉及的 URI 要从 Content Provider 中删除时,必须调用一下 Context.revokeUriPermission()

请参阅 <grant-uri-permission> 元素。

android:icon
代表 Content Provider 的图标。 本属性必须设为对 drawable 资源的引用,该资源包含了图片的定义。 如果未设置本属性,则会用全局性的应用程序的图标来代替。 (参阅 <application> 元素的 icon 属性)。
android:initOrder
相对于同一进程中其他 Content Provider 而言,本 Content Provider 的实例化顺序。 如果多个 Content Provider 之间存在依赖关系,可以用本属性来确保按照需要的依赖关系来创建各个 Content Provider 。 本属性值是一个整数,数值越大就越先被初始化。
android:label
供用户阅读的 Content Provider 的文本标签。 如果未设置本属性,则用全局性的应用程序文本标签代替(参阅 <application> 元素的 label 属性)。

本文本标签应该设为对字符串资源的引用,这样就能像用户界面中的其他字符串一样对其进行本地化。 不过为了应用程序开发时的便利,也可以直接设置为字符串。

android:multiprocess
是否在每个客户端进程中都能创建 Content Provider 的实例 —“true”表示可以在多个进程中运行实例,“false”表示不可以。 缺省值是“false”。

通常情况下,Content Provider 是在定义它的应用程序的进程中实例化的。 然而,如果本属性置为“true”,则系统可以在每个需要用到它的客户端程序所在的进程中都创建一个实例,这样就避免了进程间通讯的开销。

android:name
实现 Content Provider 的类名称,即 ContentProvider 的子类。 这应该是一个完全限定的类名称(比如“com.example.project.TransportationProvider”)。 不过作为简称,如过首字符为句点,则会在名称前面自动加上 <manifest> 元素指定的包名称。

没有默认值。名称必须指定。

android:permission
客户端读写 Content Provider 中的数据所必需的权限名称。 本属性为一次设置读和写权限提供了快捷途径。 不过,readPermissionwritePermission属性优先于本设置。 如果同时设置了readPermission属性,则其将控制对 Content Provider 的读取。 如果设置了writePermission属性,则其也将控制对 Content Provider 数据的修改。

关于权限的详细信息,请参阅 Manifest 介绍一文的 Permissions 章节和另一篇文档 安全和权限。

android:process
运行 Content Provider 的进程名称。 通常,应用程序的所有组件都运行在创建时的默认进程中。 该进程的名称与程序包名相同。 <application> 元素的 process 属性也可以为每个组件设置不同的默认进程。 但每个组件也可以用各自的process属性覆盖默认进程名称,使得程序可以跨越多个进程运行。

如果本属性设置的名称以冒号(‘:‘)开头,则必要时会新建一个属于该程序私有的进程,Content Provider 将在此新进程中运行。 如果进程名称以小写字母开头,则内容提供器将在一个以此名字命名的全局进程中运行,并赋予应有的访问权限。 这就允许不同应用程序的多个组件可以共享同一个进程,以减少对资源的占用。

android:readPermission
查询 Content Provider 的客户端所必需的权限。 参见permissionwritePermission属性。
android:syncable
Content Provider 所控制的数据是否需要与某个服务器进行同步 — “true”表示需要同步,“false”表示不需要。
android:writePermission
修改 Content Provider 数据的客户端所必需的权限。 请参阅permissionreadPermission属性。
引入自:
API 级别 1
参阅:
Content Provider

Android开发-API指南-<provider>