HarmonyOS鸿蒙Next中同模块ability跳转到另一个ability,弹窗能否依旧显示?

HarmonyOS鸿蒙Next中同模块ability跳转到另一个ability,弹窗能否依旧显示? 场景:类似wx的消息上方弹的消息提示弹窗,如果我不对该弹窗进行操作,它就会一直显示在顶上方,不影响我点击该蒙层下方的操作,包括跳转到另一个功能等

目前采用的promptAction的openCustomDialog的api,页面跳转可以显示,ability不太行,有ability对应实现方式吗?

4 回复

解决方案

开发者你好,每个UIAbility都有独立的UI上下文,promptAction需要依赖上下文,新的UIAbility唤起时,会有独立的UI,无法保留上个UIAbility弹窗。
可以在跳转新UIAbility时,将相关参数传递给这个新的UIAbility,根据这些参数重新构建弹窗。

推荐使用UIContext中获取到的PromptAction对象提供的openCustomDialog接口在相对应用复杂的场景来实现自定义弹出框,优势点在于页面解耦,支持动态刷新

如果您有其他疑问,欢迎再反馈!

更多关于HarmonyOS鸿蒙Next中同模块ability跳转到另一个ability,弹窗能否依旧显示?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


或者说鸿蒙有没有类似安卓的这种机制?:

实现监听onActivityResumed事件,每当有Activity被推到前台时,会将x x x 组件从老Activity移除,添加到新Activity;新Activity关闭后会重新触发onActivityResumed事件,进而x x x 组件再次被移除添加

在HarmonyOS Next中,同模块内Ability跳转到另一个Ability时,弹窗默认不会跨Ability显示。若需保持弹窗显示,需使用UIExtensionContext的startAbilityWithUIExtension()方法启动目标Ability,并配置UIExtensionAbility作为弹窗容器。

在HarmonyOS Next中,同模块Ability间跳转时,通过promptAction.openCustomDialog打开的弹窗默认会被销毁,这是由Ability生命周期管理的。要实现弹窗在Ability跳转后持续显示,核心思路是将弹窗与UI解耦,使其脱离单个Ability的上下文。

推荐采用以下两种方案:

方案一:使用UIExtension组件(推荐) 这是ArkUI最新的跨Ability UI共享方案。将弹窗UI封装为一个独立的UIExtensionComponent,并在EntryAbility或一个独立的ServiceAbility中作为常驻UI运行。其他Ability通过UIExtensionContentSession与该组件通信并控制其显示。这样弹窗的UI层与业务逻辑Ability完全分离,跳转时不受影响。

方案二:使用ServiceAbility + 系统悬浮窗权限

  1. 创建一个ServiceAbility,在其onStart中通过window.getLastWindow(this.context)获取窗口并创建WebComponent或自定义组件节点来承载弹窗UI。
  2. 在主Ability中通过featureAbility.startAbility启动并连接该Service。
  3. 使用windowManager的接口(需申请ohos.permission.SYSTEM_FLOAT_WINDOW权限)将Service的窗口设置为顶级悬浮窗。这样该窗口将独立于应用内任何Ability,跳转时自然保持显示。

关键点

  • 方案一更符合HarmonyOS Next的设计范式,无需悬浮窗权限,但需要对ArkUI的UIExtension有较好理解。
  • 方案二更接近传统实现,但需要处理权限申请和更底层的窗口管理。
  • 两种方案的本质都是将“全局弹窗”作为一个独立的UI实例来管理,而不是将其绑定到某个具体Ability的UI上下文。

具体选择取决于你的应用架构和对新特性的接纳程度。UIExtension是更面向未来的方案。

回到顶部