查看: 257|回复: 1

HarmonyOS 6.1.1 Live View Kit 实战:辅助区一键结束与存活时间控制

[复制链接]
发表于 昨天 18:00 | 显示全部楼层 |阅读模式
在HarmonyOS 6.1.1(API 24)中,Live View Kit(实况窗服务)迎来了两项关键升级:辅助区一键销毁枚举ActionType.ACTION_TYPE_STOP_LIVEVIEW,以及最长存活时间参数PrimaryData.aliveTime。这两项特性解决了实况窗生命周期管控中的两大痛点——进程残留与用户操作繁琐。本文将深入解析这些新能力的设计思路,并给出可落地的模拟开发示例。

一、痛点与升级背景

实况窗作为HarmonyOS的核心交互资产,在打车、外卖、值机等长周期场景中极大提升了用户体验。但在实际生产中,部分应用在业务结束后(如外卖已送达、网约车已到达)未能及时调用stopLiveView,导致实况窗长期挂载,迫使后台服务(地理定位、WebSocket等)持续唤醒,造成电量流失与内存泄漏。同时,用户若想提前清理状态,只能解锁设备、找到对应应用或进入设置关闭,交互摩擦度高。为此,API 24在卡片辅助区行为中新增了
  1. ACTION_TYPE_STOP_LIVEVIEW
复制代码
枚举,并引入了全局最长存活时间
  1. aliveTime
复制代码
参数,实现了实况窗的“零残留、全自主”管控。

二、核心API解析

1. ActionType枚举丰富

此前,点击实况窗辅助区(通常为卡片右上角或胶囊右侧的操作区)只能通过
  1. ACTION_TYPE_OPEN_APP_PAGE
复制代码
拉起应用页面。API 24新增了
  1. ACTION_TYPE_STOP_LIVEVIEW = 3
复制代码
,它允许系统框架直接关闭实况窗口,整个过程无需主应用进程存活,从而最大化节约整机资源。
  1. enum ActionType {
  2.     ACTION_TYPE_OPEN_APP_PAGE = 1,
  3.     ACTION_TYPE_STOP_LIVEVIEW = 3
  4. }
复制代码

2. PrimaryData新增生命控制字段

PrimaryData接口承载实况通知的全部卡片样式与生命周期策略。API 24新增了两个重要字段:

-
  1. aliveTime
复制代码
:实况窗最长存活时间,范围[15, 28800]秒。一旦实况窗创建后持续存活达到该秒数,系统服务将强制终止,即使提供方应用因断网、崩溃或被系统杀进程而未调用stopLiveView。
-
  1. keepTime
复制代码
:实况窗存档保留时间,结束实况窗后通知仍保留在通知中心的时长,范围[0, 3600]秒。
  1. interface PrimaryData {
  2.     title: string;
  3.     content: Array<RichText>;
  4.     clickAction: WantAgent;
  5.     extensionData?: ExtensionData;
  6.     layoutData: ProgressLayout | PickupLayout | ...;
  7.     aliveTime?: number;
  8.     keepTime?: number;
  9. }
复制代码

三、内核态流转:零功耗终结

当用户在锁屏界面或通知中心点击实况卡片的辅助区关闭按钮时,整个事件响应路径不惊动应用进程。系统服务LiveViewService直接处理ActionType为STOP_LIVEVIEW的点击,立即销毁该实况窗口并释放相关资源。这种设计巧妙地实现了“零功耗终结”,即使应用进程已被系统回收,实况窗也能被准时清理。

四、实战模拟:构建仿真控制舱

为了在开发阶段验证新特性,我们可以构建一个无物理签名依赖的仿真控制舱。以下代码基于ArkTS实现,包含状态栏胶囊模拟、锁屏卡片渲染、存活时间滑块与辅助区点击行为切换。

1. 工程结构

在entry模块的pages目录下创建LiveViewKitEnhanceDetail.ets,并确保路由配置正确。

2. 核心代码片段

定义枚举与组件状态:
  1. enum ActionType {
  2.     ACTION_TYPE_OPEN_APP_PAGE = 1,
  3.     ACTION_TYPE_STOP_LIVEVIEW = 3
  4. }
  5. @Entry
  6. @Component
  7. struct LiveViewKitEnhanceDetail {
  8.     @State isLiveViewActive: boolean = false;
  9.     @State aliveTimeSetting: number = 30;
  10.     @State currentActionType: ActionType = ActionType.ACTION_TYPE_STOP_LIVEVIEW;
  11.     @State secondsRemaining: number = 30;
  12.     @State consoleLogs: string[] = [];
  13.     // ... 省略其他状态和生命周期方法
复制代码

模拟投放实况窗并启动定时器:
  1. startLiveViewSimulation() {
  2.     if (this.isLiveViewActive) return;
  3.     this.isLiveViewActive = true;
  4.     this.secondsRemaining = this.aliveTimeSetting;
  5.     this.pushLog('创建实况窗成功: aliveTime = ' + this.aliveTimeSetting + 's');
  6.     // 模拟系统最长存活时间硬终止
  7.     this.clearSimulationTimer();
  8.     this.timerId = setInterval(() => {
  9.         if (this.secondsRemaining > 1) {
  10.             this.secondsRemaining--;
  11.         } else {
  12.             this.pushLog('aliveTime已到,系统底层自动终止实况窗');
  13.             this.stopLiveViewSimulation('SYSTEM_AUTO_EXPIRE');
  14.         }
  15.     }, 1000);
  16. }
复制代码

处理辅助区点击:
  1. handleAuxiliaryAreaClick() {
  2.     if (!this.isLiveViewActive) return;
  3.     if (this.currentActionType === ActionType.ACTION_TYPE_STOP_LIVEVIEW) {
  4.         this.stopLiveViewSimulation('AUXILIARY_STOP_BUTTON');
  5.     } else {
  6.         this.pushLog('触发ACTION_TYPE_OPEN_APP_PAGE: 模拟拉起页面');
  7.     }
  8. }
复制代码

UI层使用Slider调节aliveTime,Radio切换ActionType,并实时渲染模拟胶囊和锁屏卡片。完整的UI构建代码可参考原文,但核心逻辑如上。

五、影响与建议

aliveTime参数为长周期实况窗提供了“安全绳”,尤其是网络不稳定的场景下,即使应用端无法正常stopLiveView,系统也能按预设时间清理。ACTION_TYPE_STOP_LIVEVIEW则让用户可直接在锁屏上关闭实况,减少不必要的后台唤醒。开发者应优先在业务逻辑中合理设置aliveTime(建议大于业务预期最大时长但不过大),并将辅助区行为配置为STOP_LIVEVIEW以提升用户控制感。对于外卖、打车等典型场景,建议aliveTime设为60~300秒,配合keepTime(如30秒)保留短暂的通知存档记录。

这种“系统级兜底+用户侧一键终止”的双保险机制,标志着实况窗生命周期管控进入了精细化时代,为鸿蒙应用的电量优化和交互流畅度提供了引擎级支撑。
回复

使用道具 举报

发表于 昨天 18:05 | 显示全部楼层

Re: HarmonyOS 6.1.1 Live View Kit 实战:辅助区一键结束与存活时间控制

看了楼主的分析,确实把API 24这两个新能力的痛点讲得很透彻。实况窗的“零功耗终结”设计思路很有意思,系统层面直接处理销毁,不再依赖应用进程存活,这对后台资源管控是切实的优化。那个辅助区一键关闭的枚举,配上aliveTime参数,基本上解决了之前生产环境中实况窗“死不了”的尴尬。 模拟控制舱的代码示例也很实用,对于想快速验证新特性的开发者来说,直接跑个仿真环境确实比每次都真机签名调试高效多了。想请教一下,aliveTime设置后,如果实况窗内容正在持续更新(比如倒计时、进度),到达存活时间时系统是会立即销毁还是允许当前展示的最后一帧走完?另外keepTime和aliveTime配合使用时,有没有遇到过存档保留时间还没到但系统就已经把实况通知从通知中心移除的情况?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-9 00:59 , Processed in 0.025172 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部