当前位置:首页>鸿蒙APP>鸿蒙 ArkTS 实况窗开发全解(含可运行代码)

鸿蒙 ArkTS 实况窗开发全解(含可运行代码)

  • 2026-08-19 13:59:08
鸿蒙 ArkTS 实况窗开发全解(含可运行代码)

实况窗(Live View)是鸿蒙系统的核心特色能力,可在状态栏、通知中心、锁屏界面实时展示应用动态(如外卖配送、打车进度、排队取号),无需解锁即可查看关键信息,大幅提升用户体验Huawei Developer。本文基于鸿蒙 API12+,用 ArkTS 原生开发即时配送场景实况窗,含胶囊提示、进度卡片、状态更新、点击跳转,代码可直接复制运行,适配手机 / 平板全场景。

一、核心能力与应用场景

1.1 实况窗核心优势

  • 多位置展示
    :状态栏胶囊(极简提示)+ 通知中心 / 锁屏卡片(详情展示)Huawei Developer;
  • 实时动态更新
    :支持进度、文字、图标动态刷新,适配长时任务;
  • 交互能力
    :点击胶囊 / 卡片可跳转应用指定页面,闭环操作;
  • 原生低耗
    :系统级组件,占用资源少,后台稳定运行。

1.2 典型应用场景

  • 即时配送:外卖 / 生鲜订单进度(商家接单→骑手取餐→送达)Huawei Developer;
  • 出行打车:车辆位置、预计到达时间、车牌号展示;
  • 排队取号:餐厅 / 医院排队进度、预计等待时间Huawei Developer;
  • 运动健康:跑步配速、距离、心率实时展示(锁屏可见)。

二、开发前置准备

2.1 环境要求

  • 系统版本:鸿蒙 OS 5.0+(API12+);
  • 开发工具:DevEco Studio 4.1+;
  • 设备支持:华为手机(P50 及以上)、平板,开启 “实况窗” 权限(设置→通知与状态栏→实况窗)。

2.2 依赖与权限配置

  1. 模块引入:在oh-package.json5中添加实况窗依赖
{  "dependencies": {    "@kit.LiveViewKit": "1.0.0" // 实况窗核心库  }}
权限申请:在module.json5添加权限
{  "requestPermissions": [    {      "name": "ohos.permission.LIVE_VIEW", // 实况窗权限      "reason": "用于展示订单实时进度",      "usedScene": {        "abilities": ["EntryAbility"],        "when": "inuse"      }    }  ]}

三、完整可运行代码(即时配送场景)

3.1 工具类:实况窗管理(LiveViewUtil.ets)

封装实况窗创建、更新、销毁逻辑,统一管理状态

import { liveViewManager, LayoutType, IndicatorType, LineType } from '@kit.LiveViewKit';import { Want, wantAgent } from '@kit.AbilityKit';// 实况窗状态枚举export enum DeliveryStatus {  PENDING = 0,    // 待接单  ACCEPTED = 1,   // 商家已接单  PICKUP = 2,     // 骑手取餐  DELIVERING = 3, // 配送中  COMPLETED = 4   // 已送达}export class LiveViewUtil {  // 实况窗唯一ID(自定义,全局唯一)  private static readonly LIVE_VIEW_ID = 1001;  // 订单号(模拟)  private static readonly ORDER_ID = "DD20260507001";  // 1. 校验实况窗是否开启  static async isLiveViewEnable(): Promise<boolean> {    try {      return await liveViewManager.isLiveViewEnabled();    } catch (e) {      console.error("校验实况窗权限失败:", e);      return false;    }  }  // 2. 构建点击跳转能力(点击卡片/胶囊跳转应用详情页)  private static async buildClickAction(): Promise<Want> {    const wantAgentInfo: wantAgent.WantAgentInfo = {      wants: [{        bundleName: "com.example.liveviewdemo", // 替换为你的包名        abilityName: "EntryAbility",        uri: `liveview://detail?orderId=${this.ORDER_ID}`      } as Want],      actionType: wantAgent.OperationType.START_ABILITIES,      requestCode: 1002,      actionFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]    };    return await wantAgent.getWantAgent(wantAgentInfo);  }  // 3. 创建/更新实况窗(核心方法)  static async createOrUpdateLiveView(status: DeliveryStatus, progress: number): Promise<void> {    if (!await this.isLiveViewEnable()) {      console.warn("用户未开启实况窗权限,无法创建");      return;    }    try {      // 构建实况窗配置      const liveViewConfig: liveViewManager.LiveView = {        id: this.LIVE_VIEW_ID,        event: "DELIVERY", // 场景:即时配送        liveViewData: {          // 卡片区域(通知中心/锁屏展示)          primary: {            title: `订单 ${this.ORDER_ID}`,            content: this.getContentByStatus(status), // 动态文字内容            keepTime: 30, // 卡片展示时长(秒)            clickAction: await this.buildClickAction(),            // 进度条布局(配送进度可视化)            richProgress: {              type: 0, // 进度条类型              progress: progress, // 进度值(0-100)              color: "#FF0A59F7", // 进度条主色              bgColor: "#19000000", // 背景色              indicatorType: IndicatorType.INDICATOR_TYPE_UP, // 指示器向上              indicatorIcon: "resource://rawfile/rider.png", // 指示器图标(骑手)              lineType: LineType.LINE_TYPE_SOLID_LINE, // 实线进度条              nodeIcons: [ // 阶段图标(待接单→接单→取餐→送达)                "resource://rawfile/icon_pending.png",                "resource://rawfile/icon_accept.png",                "resource://rawfile/icon_pickup.png",                "resource://rawfile/icon_complete.png"              ]            }          },          // 胶囊区域(状态栏极简提示)          capsule: {            type: liveViewManager.CapsuleType.CAPSULE_TYPE_TEXT,            status: 1, // 胶囊状态:1=正常展示            icon: "resource://rawfile/capsule_delivery.png", // 胶囊图标            backgroundColor: "#FF0A59F7", // 胶囊背景色            title: this.getCapsuleText(status) // 胶囊文字(极简)          }        }      };      // 启动/更新实况窗      const result = await liveViewManager.startLiveView(liveViewConfig);      if (result.resultCode === 0) {        console.log("实况窗创建/更新成功:", result.message);      } else {        console.error("实况窗操作失败:", result.message);      }    } catch (e) {      console.error("创建实况窗异常:", e);    }  }  // 4. 销毁实况窗(订单结束时调用)  static async destroyLiveView(): Promise<void> {    try {      await liveViewManager.stopLiveView({ id: this.LIVE_VIEW_ID });      console.log("实况窗销毁成功");    } catch (e) {      console.error("销毁实况窗异常:", e);    }  }  // 5. 根据状态获取卡片文字内容  private static getContentByStatus(status: DeliveryStatus): Array<{ text: string, textColor?: string }> {    switch (status) {      case DeliveryStatus.PENDING:        return [{ text: "等待商家接单..." }];      case DeliveryStatus.ACCEPTED:        return [{ text: "商家已接单,准备出餐" }];      case DeliveryStatus.PICKUP:        return [{ text: "骑手已取餐,正在赶往目的地" }];      case DeliveryStatus.DELIVERING:        return [          { text: "配送中,距离约500米 | 预计" },          { text: "15分钟", textColor: "#FF0A59F7" },          { text: "送达" }        ];      case DeliveryStatus.COMPLETED:        return [{ text: "订单已送达,感谢购买!" }];      default:        return [{ text: "订单状态未知" }];    }  }  // 6. 根据状态获取胶囊极简文字  private static getCapsuleText(status: DeliveryStatus): string {    switch (status) {      case DeliveryStatus.PENDING: return "待接单";      case DeliveryStatus.ACCEPTED: return "已接单";      case DeliveryStatus.PICKUP: return "已取餐";      case DeliveryStatus.DELIVERING: return "配送中";      case DeliveryStatus.COMPLETED: return "已送达";      default: return "订单更新";    }  }}
3.2 页面逻辑(Index.ets):模拟订单状态流转
import { LiveViewUtil, DeliveryStatus } from './utils/LiveViewUtil';import { CommonActions, Router } from '@kit.ArkUI';@Entry@Componentstruct Index {  @State currentStatus: DeliveryStatus = DeliveryStatus.PENDING;  @State progress: number = 10; // 初始进度10%  @State timer: number | null = null;  aboutToAppear() {    // 页面加载完成后,初始化实况窗    this.initLiveView();  }  aboutToDisappear() {    // 页面销毁时,停止定时器    if (this.timer) clearInterval(this.timer);  }  // 初始化:创建实况窗 + 模拟状态自动更新  async initLiveView() {    // 1. 校验权限并创建初始实况窗    await LiveViewUtil.createOrUpdateLiveView(this.currentStatus, this.progress);    // 2. 模拟订单状态自动流转(每5秒更新一次)    this.timer = setInterval(async () => {      // 状态递进(循环)      this.currentStatus = (this.currentStatus + 1) % 5;      // 进度递增(0→100)      this.progress = Math.min(this.progress + 20, 100);      // 更新实况窗      await LiveViewUtil.createOrUpdateLiveView(this.currentStatus, this.progress);      // 订单完成后,清除定时器,3秒后销毁实况窗      if (this.currentStatus === DeliveryStatus.COMPLETED) {        if (this.timer) clearInterval(this.timer);        setTimeout(() => {          LiveViewUtil.destroyLiveView();        }, 3000);      }    }, 5000);  }  // 手动更新状态(按钮点击)  async updateStatus() {    this.currentStatus = (this.currentStatus + 1) % 5;    this.progress = Math.min(this.progress + 20, 100);    await LiveViewUtil.createOrUpdateLiveView(this.currentStatus, this.progress);  }  build() {    Column({ space: 20, justifyContent: FlexAlign.Center }) {      Text("鸿蒙实况窗演示(外卖配送)")        .fontSize(20)        .fontWeight(FontWeight.Bold)      Text(`当前状态:${LiveViewUtil.getCapsuleText(this.currentStatus)}`)        .fontSize(16)        .color("#333")      Text(`配送进度:${this.progress}%`)        .fontSize(16)        .color("#FF0A59F7")      Button("手动更新订单状态")        .width("80%")        .height(44)        .backgroundColor("#FF0A59F7")        .onClick(() => this.updateStatus())      Button("销毁实况窗")        .width("80%")        .height(44)        .backgroundColor("#FF3B30")        .onClick(() => LiveViewUtil.destroyLiveView())    }    .width("100%")    .height("100%")    .padding(20)  }}

3.3 资源文件准备

在entry/src/main/resources/rawfile目录下添加以下图标(PNG 格式,尺寸建议 24×24):

  • rider.png
    :配送进度指示器图标;
  • icon_pending.png
    :待接单阶段图标;
  • icon_accept.png
    :商家接单图标;
  • icon_pickup.png
    :骑手取餐图标;
  • icon_complete.png
    :送达完成图标;
  • capsule_delivery.png
    :状态栏胶囊图标。

四、效果演示与关键说明

4.1 运行效果

  1. 状态栏胶囊:订单状态极简展示(如 “配送中”),图标 + 文字,下拉通知中心展开详情卡片;

  1. 通知中心 / 锁屏卡片
    :显示订单号、详细状态文字、可视化进度条,点击卡片跳转应用页面;
  2. 状态自动更新
    :每 5 秒自动切换订单状态,进度条同步增长,订单完成后 3 秒自动销毁实况窗。

4.2 关键 API 解析

  1. liveViewManager.startLiveView
    :创建 / 更新实况窗,传入LiveView配置对象,返回操作结果Huawei Developer;
  2. liveViewManager.stopLiveView
    :销毁指定 ID 的实况窗,订单结束或用户取消时调用Huawei Developer;
  3. Capsule(胶囊)
    :状态栏极简组件,支持文字 / 图标,backgroundColor控制胶囊底色,title展示核心状态;
  4. richProgress(进度条)
    :卡片核心组件,progress(0-100)控制进度,nodeIcons定义各阶段图标,indicatorIcon设置当前位置指示器。

4.3 常见问题避坑

  1. 实况窗不显示
    :
    • 检查权限:是否开启ohos.permission.LIVE_VIEW权限;
    • 系统设置:手机 “设置→通知与状态栏→实况窗” 是否开启应用权限;
    • 图标路径:resource://rawfile/xxx.png路径是否正确,文件是否存在。
  2. 状态更新无反应
    :
    • 确保id全局唯一,重复 ID 会导致更新失败;
    • 检查progress值范围(0-100),超出范围进度条异常。
  3. 点击卡片不跳转
    :
    • 核对bundleName(应用包名)和abilityName(入口页面)是否正确;
    • 确保wantAgent配置正确,actionType设为START_ABILITIES。

五、扩展优化方向

  1. 多场景适配
    :扩展event字段,支持打车("TAXI")、排队("QUEUE")、运动("SPORT")等场景Huawei Developer;
  2. 推送联动更新
    :结合 Push Kit 推送服务,服务端下发状态更新指令,客户端同步刷新实况窗,适配线上生产环境Huawei Developer;
  3. 自定义样式
    :支持胶囊圆角、进度条渐变、文字字体自定义,贴合应用品牌风格;
  4. 多语言适配
    :通过i18n资源,动态切换胶囊 / 卡片文字,适配海外市场。

最新文章

随机文章