<提供方>

语法:
<provider android:authorities="list"
          android:directBootAware=["true" | "false"]
          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>
<intent-filter>
<path-permission>
说明:
声明 content provider 组件。content provider 是 ContentProvider 的子类,可提供对由应用管理的数据的结构化访问机制。应用中的所有 content provider 都必须在清单文件的 <provider> 元素中定义。否则,系统将不知道它们,也不会运行它们。

您只能声明属于您的应用的 content provider,请勿在应用中使用的其他应用中声明 content provider。

Android 系统根据授权方字符串(提供程序的内容 URI 的一部分)来存储对 content provider 的引用。例如,假设您想要访问用来存储专业医护人员相关信息的 content provider。为此,您可以调用 ContentResolver.query() 方法,它接受用来标识提供程序的 URI(以及其他参数):

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

content: 架构将 URI 标识为指向 Android Content Provider 的内容 URI。授权方 com.example.project.healthcareprovider 标识提供程序本身。Android 系统会在已知提供程序及其授权方的列表中查询该授权方。子字符串 nurses/rn 是一个路径,content provider 用它来标识提供程序数据的子集。

<provider> 元素中定义提供程序时,请勿在 android:name 参数中添加架构或路径,只能添加授权方。

如需了解如何使用和开发 content provider,请参阅Content Provider

属性:
android:authorities
一个或多个 URI 授权方的列表,这些 URI 授权方用于标识 content provider 提供的数据。列出多个授权方时,用分号将其名称分隔开来。为避免冲突,授权方名称应遵循 Java 样式的命名惯例(如 com.example.provider.cartoonprovider)。通常,它是实现提供程序的 ContentProvider 子类的名称。

没有默认值。必须至少指定一个授权方。

android:enabled
系统是否可以实例化 content provider。"true" 表示可以,"false" 表示不可以。默认值为 "true"

<application> 元素具有自己的 enabled 属性,该属性适用于所有应用组件,包括 content provider。只有在 <application><provider> 属性都为“"true"”(因为它们都默认使用该值)时,系统才能将 content provider 实例化。如果其中任一属性为“"false"”,就会停用提供程序。无法将其实例化。

android:directBootAware

content provider 是否可感知直接启动 - 也就是说,它是否可以在用户解锁设备之前运行。

注意:直接启动期间,应用中的 content provider 只能访问设备保护存储空间内的数据。

默认值为 "false"

android:exported
Content Provider 是否可供其他应用使用。
  • "true":提供程序可供其他应用使用。任何应用均可使用提供程序的内容 URI 来访问它,但需依据为提供程序指定的权限进行访问。
  • "false":提供程序不可供其他应用使用。设置 android:exported="false" 可仅限您的应用访问提供程序。只有与提供程序具有相同的用户 ID (UID) 的应用或者通过 android:grantUriPermissions 元素被临时授予对提供程序的访问权限的应用才能访问提供程序。

由于此属性是在 API 级别 17 中引入的,因此所有搭载 API 级别 16 及更低级别的设备的行为方式就像将此属性设为 "true" 一样。对于搭载 API 级别 17 及更高级别的设备,如果您将 android:targetSdkVersion 设为 17 或更高版本,则默认值为 "false"

您可以设置 android:exported="false" 并且仍然限制对提供程序的访问,方法是使用 permission 属性来设置相应权限。

android:grantUriPermissions
是否可以向一般无权访问 Content Provider 的数据的组件授予访问这些数据的权限,从而暂时克服由 readPermissionwritePermissionpermissionexported 属性施加的限制。

如果可以授予权限,则设为 "true";如果不能授予权限,则设为 "false"。如果为 "true",则可以授予对 content provider 的任何数据的权限。如果设为 "false",则只能授予对 <grant-uri-permission> 子元素中列出的数据子集(如果有)的权限。默认值为 "false"

通过授予权限,可让应用组件对受权限保护的数据进行一次性访问。例如,当电子邮件包含附件时,邮件应用可以要求适当的查看器来打开它,即使该查看器没有查看 content provider 的所有数据的常规权限也是如此。

在这种情况下,通过用于激活组件的 Intent 对象中的 FLAG_GRANT_READ_URI_PERMISSIONFLAG_GRANT_WRITE_URI_PERMISSION 标志来授予权限。例如,邮件应用可能会将 FLAG_GRANT_READ_URI_PERMISSION 放入传递给 Context.startActivity()Intent。权限特定于 Intent 中的 URI。

如果您通过将此属性设为 "true" 或通过定义 <grant-uri-permission> 子元素来启用此功能,则在从提供程序中删除覆盖的 URI 后调用 Context.revokeUriPermission()

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

android:icon
一个表示 content provider 的图标。此属性应设置为对包含图片定义的可绘制资源的引用。如果未设置此属性,则改用为整个应用指定的图标。如需了解详情,请参考 <application> 元素的 icon 属性。
android:initOrder
应按什么顺序实例化 content provider,这是相对于由同一进程托管的其他 content provider 的顺序。当 content provider 之间存在依赖关系时,为每个提供程序设置此属性可确保按这些依赖关系要求的顺序创建这些提供程序。值是一个整数,数值越高,初始化顺序越靠前。
android:label
所提供内容的用户可读标签。如果未设置此属性,则改用整个应用的标签集。如需了解详情,请参考 <application> 元素的 label 属性。

此标签通常设置为对字符串资源的引用,以便可以像界面中的其他字符串一样进行本地化。不过,为了方便您开发应用,也可以将其设为原始字符串。

android:multiprocess
如果应用在多个进程中运行,则此属性决定了是否会创建 content provider 的多个实例。如果设为 "true",则每个应用进程都有自己的 content provider 对象。如果设为 "false",则应用的进程仅共享一个 content provider 对象。默认值为 "false"

将此标志设为 "true" 可以通过减少进程间通信的开销来提高性能,但也会增加每个进程的内存占用量。

android:name
实现 content provider 的类的名称,它是 ContentProvider 的子类。这通常是完全限定的类名称,例如 "com.example.project.TransportationProvider"。不过,作为一种简写形式,如果名称的第一个字符是句点,则会将其附加到 <manifest> 元素中指定的软件包名称。

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

android:permission
客户端为了读取或写入 content provider 的数据而必须具备的权限的名称。您可以使用此属性来方便地设置适用于读取和写入的单项权限。不过,readPermissionwritePermissiongrantUriPermissions 属性优先于此属性。

如果也设置了 readPermission 属性,则该属性控制对查询 content provider 的访问权限。如果设置了 writePermission 属性,则该属性控制对修改提供程序的数据的访问权限。

如需详细了解权限,请参阅应用清单概览中的权限部分以及安全提示

android:process
应在其中运行 content provider 的进程的名称。通常,应用的所有组件都会在为应用创建的默认进程中运行。该名称与应用软件包的名称相同。

<application> 元素的 process 属性可为所有组件设置不同的默认值。不过,每个组件都可以使用自己的 process 属性替换默认属性,从而允许您跨多个进程分布应用。

如果为该属性分配的名称以冒号 (:) 开头,则系统会在需要时创建应用专用的新进程,并且 activity 会在该进程中运行。

如果进程名称以小写字符开头,则 activity 将在采用该名称的全局进程中运行,前提是它具有相应权限。这样,不同应用中的组件就可以共享进程,从而减少资源使用量。

android:readPermission

客户端要查询 content provider 而必须具备的权限。

如果提供程序将 android:grantUriPermissions 设为 "true",或者如果给定的客户端满足 <grant-uri-permission> 子元素的条件,则客户端可以获得对 content provider 的数据的临时读取访问权限。

另请参阅 permissionwritePermission 属性。

android:syncable
由 content provider 控制的数据是否可以与服务器上的数据同步。"true" 表示可以,"false" 表示不可以。
android:writePermission

客户端要对由 content provider 控制的数据进行更改而需具备的权限。

如果提供程序将 android:grantUriPermissions 设为 "true",或者如果给定的客户端满足 <grant-uri-permission> 子元素的条件,则客户端可以获得对修改 content provider 的数据的临时写入访问权限。

另请参阅 permissionreadPermission 属性。

引入于:
API 级别 1
另请参阅:
Content Provider