查看: 231|回复: 0

HarmonyOS 7.0实况窗Push免唤醒刷新与保活实战

[复制链接]
发表于 半小时前 | 显示全部楼层 |阅读模式
背景:后台查杀下的实况窗刷新难题

HarmonyOS 通过实况窗(Live View)把关键信息外显到锁屏、状态栏和通知中心,用户无需进入应用即可查看进度。到了 HarmonyOS 7.0(API 26)及更高版本,系统对后台进程的管控更严格。若应用退到后台后仍靠自身进程轮询服务器并更新实况窗,很可能被冻结或回收,导致实况窗数据停滞。要解决这个问题,核心思路是把刷新链路从应用进程迁移到 Push 链路,并理解实况窗底层的 IPC 渲染隔离模型。

一、工程结构:生命周期管理与数据接收解耦

实战工程按职责拆分,将实况窗生命周期管理和 Push 消息接收分开:
  1. entry/src/main/ets/
  2. ├── entryability
  3. │   └── EntryAbility.ets
  4. ├── liveview
  5. │   ├── LiveViewManager.ets
  6. │   ├── LiveViewConstants.ets
  7. │   └── PushMessageReceiver.ets
  8. ├── model
  9. │   └── OrderModel.ets
  10. ├── pages
  11. │   └── Index.ets
  12. └── utils
  13.     ├── Logger.ets
  14.     └── SecurityUtil.ets
复制代码
其中 LiveViewManager 负责创建、更新、销毁封装,PushMessageReceiver 负责处理云端透传数据。UI 和主逻辑只关心何时发起创建请求,后续持续刷新交给 Push 链路,形成职责单一的组件化架构。

二、Live View Kit 核心 API 与生命周期

Live View Kit 通过 @kit.LiveViewKit 提供 liveViewManager。主要接口有三个:

startLiveView(request: LiveViewRequest): Promise<string>:发起创建请求。HarmonyOS 7.0 中,LiveViewRequest 除了文本、进度条等 UI 描述,还要显式声明 primary(主状态栏胶囊视图)和 expanded(展开后的锁屏/通知栏大卡片视图)的数据结构。返回的 Promise<string> 是系统分配的全局唯一 liveViewId,后续更新与销毁都依赖它。

updateLiveView(id: string, data: LiveViewData): Promise<void>:本地刷新实况窗数据。应用在前台时,本地高频更新仍需此接口,提交局部变化的增量数据。

stopLiveView(id: string): Promise<void>:订单结束或异常终止时显式回收资源。若应用进程被杀而未清理,系统会按内置超时时间(如默认 4 小时)强制回收,但这属于不合规行为,会影响应用在系统的信用评级。

三、Push 链路免唤醒更新与 IPC 隔离渲染

在系统保活限制下,基于云端 Push 透传数据是实现毫秒级刷新的关键。@kit.PushKit 提供高优透传通道。当包含实况窗更新指令的 Push 消息到达设备端,系统底层 Push 服务会直接把数据转交给 Live View 系统服务进行卡片渲染,全程无需唤醒应用宿主进程。服务器需要同时持有设备 Push Token 和 liveViewId,下发报文时携带 liveViewId,系统才能定位目标实况窗。

实况窗能在不唤醒应用进程的情况下刷新 UI,靠的是 IPC 渲染隔离沙箱。liveViewManager 发送的是数据快照(JSON 字典),不是 UI 渲染指令。SystemUI 进程收到数据快照后,在自身安全沙箱内按预定义的系统级跨进程组件(胶囊模版、卡片模版)进行原生渲染。好处有两个:一是彻底进程隔离,第三方应用代码不能在 SystemUI 进程执行,从根源阻断通过实况窗引发内存溢出或 UI 线程阻塞的风险;二是极低功耗,更新只是少量数据在 IPC 通道(如 Binder/分布式软总线)传递,系统可直接在底层驱动屏幕刷新,无需昂贵进程上下文切换和虚拟机唤醒。

四、创建链路与权限配置

在 HarmonyOS 7.0 中,Live View 涉及系统级窗口和 Push 权限,需要在 module.json5 的 requestPermissions 中声明 ohos.permission.KEEP_BACKGROUND_RUNNING 与 ohos.permission.PUSH_MESSAGES。前者用于后台运行相关权限申请,后者用于接收 Push 消息。

LiveViewManager 封装创建与停止逻辑时,要处理防重入和异常捕获。创建时先判断 currentLiveViewId 是否存在,已存在则直接返回,避免重复创建导致系统资源泄露。构建 liveViewData 时,expandedParams 承载展开卡片细节,例如 title、description、progress、estimatedTime;capsuleParams 承载状态栏胶囊细节,例如 text、iconUrl。request 中指定业务类型 LiveViewType.DELIVERY、data 和 clickIntent。clickIntent 配置 bundleName、abilityName 以及 parameters(如 targetPage、id),用户点击卡片后系统可拉起 EntryAbility 并带入订单参数。startLiveView 成功后保存系统返回的 viewId;失败时捕获 error.code 与 error.message,避免权限配置遗漏导致业务崩溃。停止时调用 stopLiveView,并在成功后清空 currentLiveViewId。

五、云端 Push 报文构建

应用退到后台后,客户端代码不再运行,服务器需要按订单状态主动下发 Push。报文的核心字段包括:message.token 放置 device_push_token;message.data.action 为 live_view_update;message.data.liveViewId 必须携带创建时系统返回的唯一标识;payload 中放 title、content、expandedParams.progress、expandedParams.estimatedTime、capsuleParams.text;options.priority 设为 HIGH,确保弱网或省电模式下优先投递。

云端下发到设备后,底层 Push 进程解析到 action 为 live_view_update,直接截获数据并调用 Live View 系统服务的 IPC 接口做卡片增量更新。应用进程无需被唤醒,从而规避后台查杀导致的状态断更。整体逻辑流可分为创建链路、云端更新链路和销毁回收链路;创建完成后应用进程退出主舞台,后续循环更新由系统底层 PushService 和 SystemUI 通过安全 IPC 通道独立闭环完成。

六、避坑指南

6.1 异常崩溃导致“僵尸”实况窗。实况窗生命周期独立于应用进程。若应用未调用 stopLiveView 就发生崩溃,应用进程已死,实况窗仍挂在锁屏上,成为无法刷新的“僵尸”卡片。解法是在应用生命周期核心节点兜底清理,例如在 EntryAbility 的 onCreate 和首页 onPageShow 中,从本地首选项(Preferences)或全局状态机查询是否存在未结束订单,确认业务异常终止时主动调用 stopLiveView,清理历史残留句柄。

6.2 Push Token 与 liveViewId 状态错位。客户端可能已创建实况窗并拿到 liveViewId,但向业务服务器上报时网络超时断开。服务器没有 liveViewId,后续 Push 更新会瘫痪。解法是建立带重试补偿的上报链路:liveViewId 获取成功后立刻写入本地数据库;上报超时则启动定时指数退避重试;只有云端成功签收确认(ACK)后才清除本地持久化标志位,确保两端身份令牌状态一致。

6.3 资源标识符跨进程解析失败。capsuleParams 中的 iconUrl 若传入本地物理路径或绝对路径 URI,SystemUI 沙箱无法加载图片,卡片会显示白板。原因是 SystemUI 沙箱和应用自身处于不同安全域,私有域 URI 跨进程后没有读取权限。解法是只能使用符合系统规范的系统资源标识符(Resource Name 或 System Resource ID),或使用预置在模块根级资源文件中的标准格式,例如 app.media.xxx。系统会通过统一资源调度引擎完成安全鉴权并正确加载资源。

七、小结

这套方案的关键不是把实况窗当成普通桌面组件,而是把它看作连接用户关注点与系统底层资源调度的通道。通过 Live View Kit 管理创建与销毁,通过 Push Kit 高优透传和 SystemUI 的 IPC 沙箱渲染实现免唤醒增量刷新,可以在 HarmonyOS 7.0 严格后台管控下保持实况窗状态稳定,同时减少无意义轮询耗电。应用前台仍可用 updateLiveView 做本地更新,后台则交给云端 Push 与系统服务闭环,这是 Live View Kit 与 Push 链路配合时值得优先采用的架构取舍。
回复

使用道具 举报

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

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

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

官方核心成员

关注微信公众号

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

GMT+8, 2026-9-13 10:58 , Processed in 0.019979 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部