一、说明
声明 Content Provider 组件,可提供对由应用管理的数据的结构化访问机制。应用中的所有 Content Provider 都必须在AndroidManifest.xml文件的 <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
参数中添加架构或路径,只能添加授权方。
二、属性介绍
<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>
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 是否可感知直接启动 (direct-boot);即,它是否可以在用户解锁设备之前运行。
默认值为 "false"
。
注意:在直接启动期间,应用中的 Content Provider 只能访问设备保护存储空间内的数据。
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 的数据的组件授予访问这些数据的权限,从而暂时克服由 readPermission、writePermission、permission 和 exported 属性施加的限制。如果可以授予权限,则设为“true”;如果不能授予权限,则设为“false”。如果设为“true”,则可以授予对 Content Provider 的任何数据的权限。如果设为“false”,则只能授予对 <grant-uri-permission> 子元素中列出的数据子集(如果有)的权限。默认值为“false”。
通过授予权限,可让应用组件对受权限保护的数据进行一次性访问。例如,当电子邮件包含附件时,邮件应用可以要求适当的查看器来打开它,即使该查看器没有查看 Content Provider 的所有数据的常规权限也是如此。
在这种情况下,通过用于激活组件的 Intent 对象中的 FLAG_GRANT_READ_URI_PERMISSION 和 FLAG_GRANT_WRITE_URI_PERMISSION 标志来授予权限。例如,邮件应用可能会将 FLAG_GRANT_READ_URI_PERMISSION 放入传递给 Context.startActivity() 的 Intent。权限特定于 Intent 中的 URI。
如果您通过将此属性设为“true”或通过定义 <grant-uri-permission> 子元素来启用此功能,则必须在从提供程序中删除覆盖的 URI 后调用 Context.revokeUriPermission()。
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 的数据而必须具备的权限的名称。您可以使用此属性来方便地设置适用于读取和写入的单项权限。不过,readPermission、writePermission 和 grantUriPermissions 属性优先于此属性。如果也设置了 readPermission 属性,则该属性控制对查询 Content Provider 的访问权限。如果设置了 writePermission 属性,则该属性控制对修改提供程序的数据的访问权限。
android:process
一个进程的名称,content provide 应在该进程中运行。通常,应用的所有组件都会在为应用创建的默认进程中运行。它与应用软件包的名称相同。<application> 元素的 process 属性可以为所有组件设置不同的默认值。不过,每个组件都可以使用其自己的 process 属性替换默认属性,从而允许您跨多个进程分布应用。
如果为该属性分配的名称以冒号(“:”)开头,则系统会在需要时创建应用专用的新进程,并且 Activity 会在该进程中运行。如果进程名称以小写字符开头,则 Activity 将在采用该名称的全局进程中运行,前提是它具有相应权限。这样,不同应用中的组件就可以共享进程,从而减少资源使用量。
android:readPermission
客户端要查询 Content Provider 而必须具备的权限。
如果提供程序将 android:grantUriPermissions 设为 true,或者如果给定的客户端满足 <grant-uri-permission> 子元素的条件,则客户端可以获得对 Content Provider 的数据的临时读取访问权限。
另请参阅 permission 和 writePermission 属性。
android:syncable
由 Content Provider 控制的数据是否要与服务器上的数据同步。如果要同步,则设为“true
”;如果不同步,则设为“false
”。
android:writePermission
客户端要对由 Content Provider 控制的数据进行更改而必须具备的权限。
如果提供程序将 android:grantUriPermissions 设为 true,或者如果给定的客户端满足 <grant-uri-permission> 子元素的条件,则客户端可以获得对修改 Content Provider 的数据的临时写入访问权限。