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高功耗传感器,包括 AccelerometerGeolocationGyroscope不可用无法使用功耗较高接口
@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可用-
信息

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

限制

权限

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

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

enable_service.jpg

系统限制

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

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

service_manage.jpg

完整示例

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