Skip to main content
版本:v3+

设备应用服务

介绍​

在 Zepp OS v3 版本之前,用户在手表退出小程序「设备应用」 页面,整个小程序被销毁,失去调用 Zepp OS 开放能力的机会。

我们在 Zepp OS v3 中推出了重磅功能「设备应用服务」。

「设备应用服务」以无 UI 的方式运行,在用户退出小程序页面后,仍然可以运行。

受系统资源约束和无 UI 特性影响,「设备应用服务」在 API 调用方面存在部分限制,会在后文 限制 中详细说明。

「设备应用服务」从使用方式上来说分为两种,分为「单次执行」和「持续运行」。

1. 单次执行​

使用以下方式唤起「设备应用服务」,「设备应用服务」的运行遵循「单次执行」的策略。

「单次执行」即在相关代码执行完成后,立即退出「设备应用服务」。

提示

「单次执行」对系统资源消耗较少,是更为推荐的使用方式

2. 持续运行​

在「设备应用」中通过 @zos/app-service start API 方法可以启动「设备应用服务」,做到服务持续运行。

信息

使用 @zos/app-service start API 启动「设备应用服务」之后,退出「设备应用」UI 界面,「设备应用服务」仍然保持运行。如果在「设备应用服务」运行途中进行设备重启操作,「设备应用服务」会跟随系统重新启动,并保持运行状态。

只有当主动调用退出服务 API,或触发了系统相关限制后,「设备应用服务」才会退出。

使用「设备应用服务」​

配置「设备应用服务」​

在 小程序配置 app.json 中的 module 进行配置,一个小程序可以配置多个「设备应用服务」。

{
"module": {
"app-service": {
"services": ["app-service/demo_service"]
}
}
}

如果需要持续运行「设备应用服务」,需要调用 @zos/app-service 模块下的方法如 start,这些方法依赖 device:os.bg_service 权限,还需在 permissions 字段中配置权限信息。

{
"permissions": ["device:os.bg_service"],
"module": {
"app-service": {
"services": ["app-service/demo_service"]
}
}
}

注册「设备应用服务」​

使用 AppService 构造函数注册「设备应用服务」。

看一个代码示例,「设备应用服务」中使用 Time 传感器每分钟打印一次当前时间。

import { Time } from '@zos/sensor'

const timeSensor = new Time()

AppService({
onInit(e) {
logger.log(`service onInit(${e})`)

timeSensor.onPerMinute(() => {
logger.log(
`${moduleName} time report: ${timeSensor.getHours()}:${timeSensor.getMinutes()}:${timeSensor.getSeconds()}`
)
})
},
onDestroy() {
logger.log('service on destroy invoke')
}
})

「设备应用服务」执行策略​

唤起单次执行的「设备应用服务」​

目前有以下方式可以唤起单次执行的「设备应用服务」

管理持续运行的「设备应用服务」​

在「设备应用」中通过 @zos/app-service start API 和 @zos/app-service stop API 来管理「设备应用服务」。

在「设备应用服务」中调用 @zos/app-service exit API 来退出当前「设备应用服务」。

系统 API 能力与限制​

「设备应用服务」无 UI 界面,在系统 API 能力使用上有较多限制,以下表格中列举 API 的可用性,* 代表整个模块。

API 模块API 描述是否可用描述
全局定时器相关接口,如 setTimeout不可用无法使用定时器相关接口
@zos/ui*不可用「设备应用服务」无 UI 界面
@zos/sensor高功耗传感器,包括 Accelerometer、Geolocation、Gyroscope不可用无法使用功耗较高接口
@zos/sensor除高功耗传感器以外的传感器,如 HeartRate可用-
@zos/app-service*可用-
@zos/notification*可用-
@zos/app名称以 get 开头的 API,如 getPackageInfo可用-
@zos/settings名称以 get 开头的 API,如 getSystemInfo可用-
@zos/display名称以 get 开头的 API,如 getSettings可用-
@zos/device名称以 get 开头的 API,如 getDeviceInfo可用-
@zos/user名称以 get 开头的 API,如 getProfile可用-
@zos/media音频播放相关 API可用-
@zos/ble除名称以 mst 开头的 API,如 send可用-
@zos/fs写文件相关的 API 只能在屏幕熄灭或者 AOD 息屏显示时候使用可用-
信息

「设备应用服务」无 UI 界面,与用户进行视图交互的唯一方式是 @zos/notification 「系统通知」API

限制​

权限​

唤醒单次执行的「设备应用服务」无权限限制。

持续运行的「设备应用服务」除了需要在 app.json 中注册 permissions 字段外,还需要向用户申请运行允许,使用 @zos/app 模块下的 queryPermission 进行权限的查询,requestPermission 向用户申请权限。如果用户拒绝权限,则持续运行的「设备应用服务」无法启动。

enable_service.jpg

系统限制​

对于单次执行的「设备应用服务」,系统限制其执行时间在 600ms 内。

对于持续运行的「设备应用服务」,系统限制同一时间只能运行一个「设备应用服务」,如果遇到服务冲突,会弹出交互界面,由用户指定运行哪一个「设备应用服务」。

service_manage.jpg

完整示例​

Github Sample 仓库中提供了一个后台服务 demo 用于演示完整功能,请参考 3.0-feature