Android复习(三)清单文件中的元素——> provider、receiver、service
<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
- 是否可以向一般无权访问内容提供程序的数据的组件授予访问这些数据的权限,从而暂时克服由
readPermission
、writePermission
、permission
和exported
属性施加的限制。如果可以授予权限,则设为“true
”;如果不能授予权限,则设为“false
”。如果设为“true
”,则可以授予对内容提供程序的任何数据的权限。如果设为“false
”,则只能授予对<grant-uri-permission>
子元素中列出的数据子集(如果有)的权限。默认值为“false
”。通过授予权限,可让应用组件对受权限保护的数据进行一次性访问。例如,当电子邮件包含附件时,邮件应用可以要求适当的查看器来打开它,即使该查看器没有查看内容提供程序的所有数据的常规权限也是如此。
在这种情况下,通过用于激活组件的 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()
。
另请参阅
<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
- 客户端为了读取或写入内容提供程序的数据而必须具备的权限的名称。使用此属性可以方便地设置适用于读取和写入的单一权限。不过,
readPermission
、writePermission
和grantUriPermissions
属性优先于此属性。如果也设置了readPermission
属性,则该属性控制对查询内容提供程序的访问权限。如果设置了writePermission
属性,则该属性控制对修改提供程序的数据的访问权限。 android:process
- 一个进程的名称,内容提供程序应在该进程中运行。通常,应用的所有组件都在为应用创建的默认进程中运行。它与应用软件包的名称相同。
<application>
元素的process
属性可以为所有组件设置不同的默认值。但是,每个组件都可以使用自己的process
属性来替换默认值,从而允许您让应用跨越多个进程。如果为此属性分配的名称以冒号(“:”)开头,则会在需要时创建一个应用专用的新进程,并且 Activity 将在该进程中运行。如果进程名称以小写字符开头,则 Activity 将在采用该名称的全局进程中运行,前提是它具有相应权限。这样,不同应用中的组件就可以共享进程,从而减少资源使用量。
android:readPermission
-
客户端要查询内容提供程序而必须具备的权限。
如果提供程序将
android:grantUriPermissions
设为true
,或者如果给定的客户端满足<grant-uri-permission>
子元素的条件,则客户端可以获得对内容提供程序的数据的临时读取访问权限。另请参阅
permission
和writePermission
属性。 android:syncable
- 由内容提供程序控制的数据是否要与服务器上的数据同步。如果要同步,则设为“
true
”;如果不同步,则设为“false
”。 android:writePermission
-
客户端要对由内容提供程序控制的数据进行更改而必须具备的权限。
如果提供程序将
android:grantUriPermissions
设为true
,或者如果给定的客户端满足<grant-uri-permission>
子元素的条件,则客户端可以获得对修改内容提供程序的数据的临时写入访问权限。另请参阅
permission
和readPermission
属性。
<receiver>
- 语法:
-
<receiver android:directBootAware=["true" | "false"] android:enabled=["true" | "false"] android:exported=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:permission="string" android:process="string" > . . . </receiver>
- 包含于:
<application>
- 可包含:
<intent-filter>
<meta-data>
- 说明:
- 将广播接收器(
BroadcastReceiver
子类)声明为应用的组件之一。广播接收器允许应用接收由系统或其他应用广播的 Intent,即使应用的其他组件并没有运行也是如此。让系统知道广播接收器有两种方法:一种方法是使用此元素在清单文件中声明广播接收器。另一种方法是在代码中动态创建接收器,并使用
Context.registerReceiver()
方法注册接收器。如需详细了解如何动态创建接收器,请参阅
BroadcastReceiver
类说明。警告:限制您在应用中设置的广播接收器的数量。广播接收器过多会影响应用的性能及用户设备的电池续航时间。如需详细了解您可以用于安排后台工作的 API(而不是
BroadcastReceiver
类),请参阅后台优化。 - 属性:
android:directBootAware
-
广播接收器是否可感知直接启动;即,它是否可以在用户解锁设备之前运行。
注意:在直接启动期间,应用中的广播接收器只能访问存储在设备保护存储区中的数据。
默认值为
"false"
。 android:enabled
- 系统是否可以实例化广播接收器;如果可以,则为“
true
”,如果不可以,则为“false
”。默认值为“true
”。<application>
元素有自己的enabled
属性,该属性会应用于所有应用组件(包括广播接收器)。要启用广播接收器,<application>
和<receiver>
属性都必须为“true
”。如果其中一个属性为“false
”,则表示广播接收器已停用;无法对其进行实例化。 android:exported
- 广播接收器是否可以接收来自其应用外部来源的消息 - 如果可以,则为“
true
”,如果不可以,则为“false
”。如果为“false
”,则广播接收器只能接收由同一应用或具有相同用户 ID 的应用的组件发送的消息。默认值取决于广播接收器是否包含 Intent 过滤器。没有任何过滤器意味着只能由指定其确切类名称的 Intent 对象调用。这意味着接收器仅供应用内部使用(因为其他应用通常不知道类名称)。因此,在这种情况下,默认值为“
false
”。另一方面,至少存在一个过滤器意味着广播接收器用于接收由系统或其他应用广播的 Intent,所以默认值为“true
”。此属性不是限制广播接收器对外公开的唯一方式。您还可以使用权限来限制可向其发送消息的外部实体(请参阅
permission
属性)。 android:icon
- 表示广播接收器的图标。此属性必须设置为对包含图片定义的可绘制资源的引用。如果未设置,则改用为整个应用指定的图标(请参阅
<application>
元素的icon
属性)。广播接收器的图标(无论是在此处设置还是由
<application>
元素设置)也是接收器的所有 Intent 过滤器的默认图标(请参阅<intent-filter>
元素的icon
属性)。 android:label
- 广播接收器的用户可读标签。如果未设置此属性,则改用整个应用的标签集(请参阅
<application>
元素的label
属性)。广播接收器的标签(无论是在此处设置还是由
<application>
元素设置)也是接收器的所有 Intent 过滤器的默认标签(请参阅<intent-filter>
元素的label
属性)。此标签应设置为对字符串资源的引用,以便可以像界面中的其他字符串一样进行本地化。不过,为了方便您开发应用,还可以将此标签设置为原始字符串。
android:name
- 实现广播接收器的类(
BroadcastReceiver
的子类)的名称。此名称应该是一个完全限定类名称(如“com.example.project.ReportReceiver
”)。不过,作为一种简写形式,如果名称的第一个字符是句点,(如“. ReportReceiver
”),则会将其附加到<manifest>
元素中指定的软件包名称。发布应用后,不能更改此名称(除非您已设置
android:exported="false"
)。没有默认值。必须指定此名称。
android:permission
- 广播方要向广播接收器发送消息而必须具备的权限的名称。如果未设置此属性,则由
<application>
元素的permission
属性设置的权限会应用于广播接收器。如果这两个属性均未设置,则接收器不受权限保护。 android:process
- 广播接收器应在其中运行的进程的名称。通常,应用的所有组件都会在为应用创建的默认进程中运行。它的名称与应用软件包的名称相同。
<application>
元素的process
属性可以为所有组件设置不同的默认值。不过,每个组件都可以使用其自己的process
属性替换默认属性,从而允许您跨多个进程分布应用。如果分配给此属性的名称以冒号(“:”)开头,则系统会在需要时创建一个只有该应用可见的新进程,然后广播接收器会在该进程中运行。 如果进程名称以小写字符开头,则接收器会在使用该名称的全局进程中运行,前提是它有权执行此操作。这样,不同应用中的组件可以共用一个进程,从而减少资源使用量。
<service>
- 语法:
-
<service android:description="string resource"
android:directBootAware=["true" | "false"]
android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:foregroundServiceType=["connectedDevice" | "dataSync" |
"location" | "mediaPlayback" | "mediaProjection" |
"phoneCall"]
android:icon="drawable resource"
android:isolatedProcess=["true" | "false"]
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
. . .
</service> - 包含它的文件:
<application>
- 可包含:
<intent-filter>
<meta-data>
- 说明:
- 将服务(
Service
子类)声明为应用的一个组件。与 Activity 不同,服务缺少可视化界面。服务用于实现长时间运行的后台操作,或可由其他应用调用的富通信 API。必须用清单文件中的
<service>
元素表示所有服务。系统不会识别和运行任何未进行声明的服务。 - 属性:
android:description
- 向用户描述服务的字符串。您应将此标签设置为对字符串资源的引用,以便可以像对界面中的其他字符串那样对其进行本地化。
android:directBootAware
-
服务是否支持直接启动,即其是否可以在用户解锁设备之前运行。
注意:在直接启动期间,应用中的服务仅可访问存储在设备保护存储区的数据。
默认值为
"false"
。 android:enabled
- 系统是否可实例化服务 —“
true
”表示可以,“false
”表示不可以。默认值为“true
”。<application>
元素拥有自己的enabled
属性,该属性适用于所有应用组件,包括服务。只有在<application>
和<service>
属性都为“true
”(因为它们都默认使用该值)时,系统才能启用服务。任何一项为“false
”都会造成服务停用,从而使系统无法将其实例化。 android:exported
- 其他应用的组件是否能调用服务或与之交互 —“
true
”表示可以,“false
”表示不可以。当该值为“false
”时,只有同一个应用或具有相同用户 ID 的应用的组件可以启动服务或绑定到服务。默认值取决于服务是否包含 Intent 过滤器。没有任何过滤器意味着服务只能通过指定其确切的类名称进行调用。这意味着服务专供应用内部使用(因为其他应用不知晓其类名称)。因此,在这种情况下,默认值为“
false
”。另一方面,至少存在一个过滤器意味着服务专供外部使用,因此默认值为“true
”。此属性并非是唯一限制向其他应用披露服务的方式。您还可使用权限来限制哪些外部实体可以与服务交互(请参阅
permission
属性)。 android:foregroundServiceType
-
阐明服务是满足特定用例要求的前台服务。例如,
"location"
类型的前台服务表示应用正在获取设备的当前位置,目的通常是继续用户发起的操作,且该操作与设备位置相关。您可以将多个前台服务类型分配给特定服务。
android:icon
- 表示服务的图标。必须将该属性设置为对包含图像定义的可绘制资源的引用。如果未设置该属性,则转而使用为应用整体指定的图标(请参阅
<application>
元素的icon
属性)。服务的图标(无论是在此处设置,还是由
<application>
元素设置)同时也是服务所有 Intent 过滤器的默认图标(请参阅<intent-filter>
元素的icon
属性)。 android:isolatedProcess
- 如果设置为 true,则此服务将在与系统其余部分隔离的特殊进程下运行。此服务自身没有权限,只能通过 Service API 与其进行通信(绑定和启动)。
android:label
- 可向用户显示的服务名称。如果未设置该属性,则转而使用为应用整体设置的标签(请参阅
<application>
元素的label
属性)。服务的标签(无论是在此处设置,还是由
<application>
元素设置)同时也是服务所有 Intent 过滤器的默认标签(请参阅<intent-filter>
元素的label
属性)。您应将此标签设置为对字符串资源的引用,以便可以像对界面中的其他字符串那样对其进行本地化。不过,为便于开发应用,您也可将其设置为原始字符串。
android:name
- 实现服务的
Service
子类的名称。此名称应为完全限定类名称(例如“com.example.project.RoomService
”)。不过,为简便起见,如果名称的第一个字符是句点(例如,“.RoomService
”),则名称将追加至<manifest>
元素中指定的软件包名称。一旦发布应用,即不应更改该名称(除非您设置了
android:exported="false"
)。没有默认值。必须指定该名称。
android:permission
- 实体启动服务或绑定到服务所必需的权限的名称。如果
、startService()
或bindService()
的调用者尚未获得此权限,该方法将不起作用,且系统不会将 Intent 对象传送给服务。stopService()
如果未设置该属性,则对服务应用由
<application>
元素的permission
属性所设置的权限。如果二者均未设置,则服务不受权限保护。 android:process
- 将运行服务的进程的名称。正常情况下,应用的所有组件都会在为应用创建的默认进程中运行。该名称与应用软件包的名称相同。
<application>
元素的process
属性可为所有组件设置不同的默认进程名称。不过,组件可以使用自己的process
属性替换默认值,让您可以将应用散布到多个进程中。如果为此属性分配的名称以冒号(“:”)开头,则系统会在需要时创建应用专用的新进程,并且服务会在该进程中运行。如果进程名称以小写字符开头,则服务将在使用该名称的全局进程中运行,前提是它拥有相应的权限。如此一来,不同应用中的组件便可共享进程,从而减少资源使用。