Android Service 属性

一. 前言

        身为Android四大组件之一的服务,在系统中扮演的角色非常重要,我们先从基础知识入手来慢慢认识它,本文主要是为跨进程通信机制的理解做一个铺垫。

二. 语法

在清单文件中注册一个服务,这些配置属性要认识一下

<service android:description="string resource"
         android:directBootAware=["true" | "false"]
         android:enabled=["true" | "false"]
         android:exported=["true" | "false"]
         android:foregroundServiceType=["camera" | "connectedDevice" |
                                        "dataSync" | "location" | "mediaPlayback" |
                                        "mediaProjection" | "microphone" | "phoneCall"]
         android:icon="drawable resource"
         android:isolatedProcess=["true" | "false"]
         android:label="string resource"
         android:name="string"
         android:permission="string"
         android:process="string" >
    . . .
</service>

重要说明:

将自定义的服务(继承Service 类)声明为应用的一个组件。与 Activity 不同,服务缺少可视化界面。服务用于实现长时间运行的后台操作。

必须用清单文件中的 <service> 元素表示所有服务。系统不会识别和运行任何未进行声明的服务。

三. 属性介绍

3.1 android:description

向用户描述服务的字符串。此标签应设置为对字符串资源的引用,以便可以像界面中的其他字符串一样进行本地化。

3.2 android:directBootAware

服务是否可感知直接启动 (direct-boot);即,它是否可以在用户解锁设备之前运行。默认值为 "false"

【备注】:在直接启动期间,应用中的服务只能访问设备保护存储空间内的数据。

3.3 android:enabled

系统是否可以实例化服务。如果可以,则设为“true”;如果不能,则设为“false”。默认值为“true”。
<application> 元素具有自己的 enabled 属性,该属性适用于所有应用组件,包括服务。

<application> 和 <service> 属性必须都为“true”(这正是它们两者的默认设置),才会启用服务如果其中任一属性为“false”,就会停用服务;无法将其实例化。

笔者验证过,特意把android:enabled=false , 发现启动不了服务,打印log如下:

W/ActivityManager( 4195): Unable to start service Intent { cmp=com.example.mysevicejava/.MyService } U=0: not found

MyService.java测试服务类,无法启动,找不到此服务。

3.4 android:exported

其他应用的组件是否能调用服务或与之交互。“true”表示可以,“false”表示不可以。当该值为“false”时,只有同一个应用或具有相同用户 ID 的应用的组件可以启动服务或绑定到服务。

默认值取决于服务是否包含 Intent 过滤器。没有任何过滤器意味着该服务只能通过指定其确切的类名称进行调用。这意味着服务专供应用内部使用(因为其他应用不知晓其类名称)。所以在这种情况下,默认值为“false”。另一方面,至少存在一个过滤器意味着该服务供外部使用,所以默认值为“true”。

3.5 android:foregroundServiceType


阐明服务是满足特定用例要求的前台服务。例如,"location" 类型的前台服务表示应用正在获取设备的当前位置,目的通常是继续用户发起的操作,且该操作与设备位置相关。

您可以将多个前台服务类型分配给特定服务。
 

3.6 android:icon

表示服务的图标。此属性必须设置为对包含图片定义的可绘制资源的引用。如果未设置此属性,则改用为整个应用指定的图标

3.7 android:isolatedProcess

如果设置为 true,则此服务将在与系统其余部分隔离的特殊进程下运行。此服务自身没有权限,只能通过 Service API 与其进行通信(绑定和启动)

3.8 android:label

可向用户显示的服务名称。 如果未设置此属性,则改用整个应用的标签集

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

3.9 android:name

实现服务的 Service 子类的名称。此名称应该是一个完全限定类名称(如“com.example.project.RoomService”)。不过,作为一种简写形式,如果名称的第一个字符是句点,(如“.RoomService”)

3.10 android:permission

实体启动服务或绑定到服务所必需的权限的名称。如果 startService()、bindService() 或 stopService() 的调用方尚未获得此权限,该方法将不起作用,且系统不会将 Intent 对象传送给服务。

3.11 android:process

将运行服务的进程的名称。通常,应用的所有组件都会在为应用创建的默认进程中运行。它与应用软件包的名称相同。<application> 元素的 process 属性可以为所有组件设置不同的默认值。不过,组件可以使用其自己的 process 属性替换默认属性,从而允许您跨多个进程分布应用。
如果为该属性分配的名称以冒号(“:”)开头,则系统会在需要时创建应用专用的新进程,并且服务会在该进程中运行。如果进程名称以小写字符开头,则服务将在采用该名称的全局进程中运行,前提是它具有相应权限。这样,不同应用中的组件就可以共享进程,从而减少资源使用量。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值