<provider>

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

您只能声明属于您的应用的内容提供程序,而不应声明在您的应用中使用的属于其他应用的内容提供程序。

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

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

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

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

如需了解如何使用和开发内容提供程序,请参阅 API 指南 - 内容提供程序

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

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

android:enabled
系统是否可以实例化内容提供程序。如果可以,则设为“true”;如果不能,则设为“false”。默认值为“true”。

<application> 元素具有自己的 enabled 属性,该属性适用于所有应用组件,包括内容提供程序。<application><provider> 属性必须都为“true”(这正是它们两者的默认设置),才会启用内容提供程序。如果其中任一属性为“false”,就会停用提供程序;无法将其实例化。

android:directBootAware

内容提供程序是否可感知直接启动 (direct-boot);即,它是否可以在用户解锁设备之前运行。

注意:在直接启动期间,应用中的内容提供程序只能访问设备保护存储空间内的数据。

默认值为 "false"

android:exported
内容提供程序是否可供其他应用使用:
  • 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
是否可以向一般无权访问内容提供程序的数据的组件授予访问这些数据的权限,从而暂时克服由 readPermissionwritePermissionpermissionexported 属性施加的限制。如果可以授予权限,则设为“true”;如果不能授予权限,则设为“false”。如果设为“true”,则可以授予对内容提供程序的任何数据的权限。如果设为“false”,则只能授予对 <grant-uri-permission> 子元素中列出的数据子集(如果有)的权限。默认值为“false”。

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

在这种情况下,通过用于激活组件的 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
一个表示内容提供程序的图标。必须将此属性设为对包含图片定义的可绘制资源的引用。如果未设置此属性,则改用为整个应用指定的图标(请参阅 <application> 元素的 icon 属性)。
android:initOrder
应按什么顺序实例化内容提供程序,这是相对于由同一进程托管的其他内容提供程序的顺序。当内容提供程序之间存在依赖关系时,为每个提供程序设置此属性可确保按这些依赖关系要求的顺序创建这些提供程序。值是一个简单的整数,数值越高,初始化顺序越靠前。
android:label
所提供内容的用户可读标签。如果未设置此属性,则改用为整个应用设置的标签(请参阅 <application> 元素的 label 属性)。

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

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

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

android:name
实现内容提供程序的类的名称,它是 ContentProvider 的子类。这应该是一个完全限定类名(如“com.example.project.TransportationProvider”)。不过,作为一种简写形式,如果名称的第一个字符是句点,则会将其附加到 <manifest> 元素中指定的软件包名称。

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

android:permission
客户端为了读取或写入内容提供程序的数据而必须具备的权限的名称。使用此属性可以方便地设置适用于读取和写入的单一权限。不过,readPermissionwritePermissiongrantUriPermissions 属性优先于此属性。如果也设置了 readPermission 属性,则该属性控制对查询内容提供程序的访问权限。如果设置了 writePermission 属性,则该属性控制对修改提供程序的数据的访问权限。

如需详细了解权限,请参阅简介中的权限部分以及一篇单独的文档 - 安全与权限

android:process
一个进程的名称,内容提供程序应在该进程中运行。通常,应用的所有组件都在为应用创建的默认进程中运行。它与应用软件包的名称相同。<application> 元素的 process 属性可以为所有组件设置不同的默认值。但是,每个组件都可以使用自己的 process 属性来替换默认值,从而允许您让应用跨越多个进程。

如果为此属性分配的名称以冒号(“:”)开头,则会在需要时创建一个应用专用的新进程,并且 Activity 将在该进程中运行。如果进程名称以小写字符开头,则 Activity 将在采用该名称的全局进程中运行,前提是它具有相应权限。这样,不同应用中的组件就可以共享进程,从而减少资源使用量。

android:readPermission

客户端要查询内容提供程序而必须具备的权限。

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

另请参阅 permissionwritePermission 属性。

android:syncable
由内容提供程序控制的数据是否要与服务器上的数据同步。如果要同步,则设为“true”;如果不同步,则设为“false”。
android:writePermission

客户端要对由内容提供程序控制的数据进行更改而必须具备的权限。

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

另请参阅 permissionreadPermission 属性。

引入于:
API 级别 1
另请参阅:
内容提供程序