HarmonyOS鸿蒙Next中Ability生命周期在多实例场景下是如何管理的?比如分屏或画中画?

HarmonyOS鸿蒙Next中Ability生命周期在多实例场景下是如何管理的?比如分屏或画中画? 我的视频播放应用要支持分屏模式。当用户把 App 拖到侧边栏时,主界面进入后台,但播放不能停。鸿蒙的 UIAbility 在多窗口下会有多个实例吗?生命周期回调(如 onForeground)如何触发?

8 回复

开发者您好,请问这边拖动分屏,是指将应用拖动到系统自带的分屏上面吗?还是说这边拖动分屏到左边是应用中自己需要实现的,请问这边是单Ability还是多Ability开发。

1、如果是需要拖到到系统自带的分屏,是希望拖动到系统分屏后,在次点开当前应用打开另一个界面这样吗?

2、如果是自己实现把组件拖拽到应用某个区域然后分屏,是希望新打开一个画中画窗口继续播放视频当前应用不关闭,还是希望其他。

如果可以的话麻烦详细描述下现在需要的业务场景。

更多关于HarmonyOS鸿蒙Next中Ability生命周期在多实例场景下是如何管理的?比如分屏或画中画?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


可以参考官方的文档:UIAbility组件各场景生命周期及监听

图片

关于鸿蒙(HarmonyOS)中UIAbility在多实例场景(如分屏或画中画)的生命周期管理,以下是核心机制和实现建议:

1. 多窗口实例机制

  • 单进程多实例:鸿蒙采用单进程多实例模型。当应用进入分屏/画中画模式时,系统会创建新的UIAbility实例(非主界面副本),而非复用原有实例。
  • 启动模式配置:需在module.json5中明确配置"launchType": "standard",允许多实例启动:
    "abilities": [{ "name": "VideoAbility", "launchType": "standard" // 关键配置 }]
    

2. 生命周期回调触发规则

  • 独立生命周期:每个窗口实例拥有独立的生命周期回调:
    • 主窗口拖入分屏
      • 原主窗口触发 onBackground()
      • 新分屏窗口触发 onCreate()onForeground()
    • 焦点切换
      • 用户点击分屏窗口时:该窗口触发 onForeground(),主窗口触发 onBackground()
    • 销毁场景
      • 关闭分屏窗口:触发该实例的 onDestroy()
      • 主窗口不受影响
  • 状态同步:各实例间状态不共享,需通过AppStorage或后台服务同步。

3. 参考一下讨论里的一个优秀案例:

开发者技术支持-鸿蒙视频播放画中画技术实现与适配经验总结

  • Singleton (单实例 - 默认)
    • 表现:全局只有一个实例。
    • 场景:当应用已在后台,用户从侧边栏拖拽应用进行分屏时,系统会将现有的实例拉起并调整窗口大小。
    • 生命周期:触发 onNewWant 回调(传递新的参数),不会触发 onCreate
  • Multiton (多实例)
    • 表现:每次启动(包括从侧边栏拖拽)都会创建一个全新的 UIAbility 实例
    • 场景:屏幕上可以同时存在两个该应用的窗口(如同时打开两个文档)。
    • 生命周期:走完整的冷启动流程:onCreate -> onWindowStageCreate -> onForeground

生命周期回调触发逻辑

分屏和播放场景,生命周期流转如下:

  • 进入分屏/悬浮窗 (可见状态)
    • 状态:保持 Foreground
    • 回调不会重新走生命周期。
    • 适配:当用户拖动分隔条改变窗口大小时,会触发 onConfigurationUpdate。您需要在此回调中根据新的窗口尺寸调整视频播放器的布局(如调整宽高比),而不是重启播放器。
  • 进入后台 (完全不可见)
    • 触发时机:用户返回到桌面,或全屏打开了另一个应用遮挡了当前应用。
    • 回调:触发 onBackground。此时系统默认行为是挂起应用,视频播放可能会暂停。

参考文档

很喜欢HarmonyOS的卡片式设计,信息一目了然,操作也更便捷。

在 Stage 模型下,一个 UIAbility 可对应多个 WindowStage 实例(每个窗口一个):

  • onCreate() / onDestroy():整个 Ability 生命周期,仅调用一次;
  • onWindowStageCreate() / onWindowStageDestroy():每个窗口独立触发;
  • onForeground() / onBackground():只要任一窗口在前台,Ability 即视为前台。

UIAbility、窗口、任务 三者是一一对应关系,每创建一个新的UIAbility就会在创建一个新的窗口,也会创建一个新的任务,所以我觉得多窗口就是多个UIAbility实例,每个UIAbility有自己独立的生命周期(createforeground,background,destroy)。

当调用方UIAbility通过 startAbility启动新的UIAbility时,

  • 如果UIAbility属于新建,则出发OnCreate回调,出现在前台就出发OnForeground,切换至后台调用OnBackground,销毁OnDestroy;
  • 如果UIAbility实例已经存在,则直接触发OnNewWant回调,其他回调与新建时一致

在HarmonyOS Next中,Ability的多实例(如分屏、画中画)通过独立的WindowStage管理。每个实例拥有独立的生命周期,由系统独立调度。分屏时,Ability实例会进入onWindowStageCreate状态;画中画模式会触发onWindowStageDestroy和新的onWindowStageCreate。系统为每个实例维护独立的上下文,确保状态隔离。

在HarmonyOS Next中,当应用进入分屏或画中画等多窗口场景时,系统会为同一个UIAbility创建多个实例。例如,在分屏模式下,每个窗口都会运行一个独立的UIAbility实例。这意味着你的视频播放应用在侧边栏小窗和主界面会分别对应两个不同的UIAbility实例。

关于生命周期管理,每个UIAbility实例都有自己独立的生命周期。当用户将应用拖入侧边栏时,原主窗口对应的UIAbility实例会进入后台(触发onBackground),而侧边栏新创建的UIAbility实例会启动并进入前台(触发onForeground)。关键在于,这两个实例是独立的,因此侧边栏的实例可以继续播放视频,而主窗口实例则处于后台状态。

你需要通过want参数来区分不同实例的启动场景,并在onCreateonNewWant中根据窗口模式(如分屏、小窗)初始化相应的界面和逻辑。对于视频播放这类持续任务,建议使用Service Ability或后台任务来管理播放状态,确保在不同UIAbility实例间能正确维持播放。

回到顶部