在HarmonyOS NEXT 6.1(API 23)中,Live View Kit与LBS服务结合,推出了基于条件触发(Trigger)的系统级实况窗接管方案。只要调用一次startLiveViewByTrigger,即使应用进程被系统杀掉,底层感知模块发现用户进入或离开指定地理围栏后,仍会自动弹出或销毁实况窗。
过去实现外卖取件码、景区导览这类场景,应用必须在后台持续调用定位并设法保活,不仅耗电严重,还容易被系统回收。新机制把监控与渲染移至系统进程,由LiveViewService和LBS模块共同完成,让应用可以做到用完即走、无感存在。
以一个“地理围栏实况窗体验舱”为例,项目结构包含EntryAbility.ets和两页:Index.ets作为入口,LiveViewKitDemo.ets实现围栏注册与触发逻辑。操作分为两个动作:进入围栏时自动挂载快递实况窗,离开围栏时由底层主动清理。
构造Trigger是第一步。开发者需要指定类型为TRIGGER_TYPE_GEOFENCE,displayTime控制展示时长,范围是15到1800秒。condition中需要设置经纬度、坐标系、监控事件、围栏半径和延迟时间。下面是进入围栏的Trigger构造示例:
- let trigger: liveViewManager.Trigger = {
- type: liveViewManager.TriggerType.TRIGGER_TYPE_GEOFENCE,
- displayTime: 15,
- condition: {
- longitude: 116.397135,
- latitude: 39.918006,
- coordinateSystemType: liveViewManager.CoordinateSystemType.COORDINATE_TYPE_GCJ02,
- monitorEvent: liveViewManager.MonitorEvent.MONITOR_TYPE_ENTRY,
- radius: 2000,
- delayTime: 0
- }
- };
复制代码
这里有几个容易踩坑的点需要注意。radius有强校验,最小200米、最大2000米,传入100会直接抛异常。坐标系支持WGS84和GCJ02,国内地图服务大多使用GCJ02。经纬度不能同时为0,也不能传入180、-90这类极限值。
注册进入触发时,需要构建包含标题、文本、图标的LiveView数据实体,再配合MONITOR_TYPE_ENTRY的Trigger调用startLiveViewByTrigger。注册离开销毁时,需使用相同的LiveView ID,配合MONITOR_TYPE_LEAVE的Trigger调用stopLiveViewByTrigger。两个调用都要做好异步错误处理。
- async testStartLiveViewGeofence() {
- this.appendLog('正在设置地理围栏触发器 (进入围栏触发) ...');
- let liveView = this.buildLiveViewMock();
- let trigger = this.buildEntryTrigger();
- try {
- this.appendLog('调用 startLiveViewByTrigger...');
- let result = await liveViewManager.startLiveViewByTrigger(liveView, trigger);
- this.appendLog('设置成功! 用户进入该坐标 2000 米范围内,将自动弹出快递实况窗。');
- } catch (err) {
- this.appendLog('设置失败: ' + JSON.stringify(err));
- }
- }
- async testStopLiveViewGeofence() {
- this.appendLog('正在设置地理围栏触发器 (离开围栏结束) ...');
- let liveView = this.buildLiveViewMock();
- let trigger = this.buildLeaveTrigger();
- try {
- this.appendLog('调用 stopLiveViewByTrigger...');
- let result = await liveViewManager.stopLiveViewByTrigger(liveView, trigger);
- this.appendLog('设置成功! 用户离开此区域时,实况窗将自动关闭。');
- } catch (err) {
- this.appendLog('设置失败: ' + JSON.stringify(err));
- }
- }
复制代码
注意,这里的buildLiveViewMock和buildEntryTrigger / buildLeaveTrigger都是封装好的构造方法,需要保证离开场景使用的LiveView ID与进入场景一致,系统才知道销毁哪一个实况窗。
权限与异常处理是这套能力的安全底线。调用API前,底层会校验定位权限和实况窗展示权限,缺失时返回1003500005。如果用户关闭系统定位总开关,会返回1003500019;关闭基于位置的“感知与建议”总开关,返回1003500020。系统还会做频控限制:每秒最多触发LiveView数量超限返回1003500008,基于条件触发的实况窗总数超限返回1003500017。设计业务时,必须充分捕获这些错误,发现定位开关关闭时引导用户到系统设置页手动开启。
总结来看,Live View Kit触发器机制不仅仅是减少几行前台代码,它代表了操作系统底层开始主动接管重资产、重耗电的感知逻辑。对全栈开发者而言,通过startLiveViewByTrigger把渲染配置与触发条件交给系统,应用可以在关键地理节点精确唤醒,同时又能做到无感存在,这是高级用户体验设计的最终归宿。 |