HarmonyOS-UIAbility 启动模式

server/2025/3/23 8:11:58/

简介

HarmonyOS涉及的启动模式,就是Android中的那个启动模式,一样的概念。它指的是一个UIAbility实例,被打开的时候,如果已经存在了UIAbility,是复用上一个呢,还是重新创建一个呢, 如果复用的话,那窗口行为应该是什么呢。 模式就是来指定这些行为的。

在HarmonyOS中启动模式被简化成了三种

  • 单例模式 singleton
  • 多实例模式 multiton
  • 指定实例模式 specified

设置方式

在module.json5文件中找到相应的UIAbility配置项,设置lanchType参数

{"module": {// ..."abilities": [{"launchType": "singleton",// ...}]}
}

singleton启动模式

singleton模式是单例模式,是默认情况下的应用启动模式。

它的表现是,每当开启一个UIAbility的时候,如果发现系统里存在一个一样的UIAbility,则就不进行创建实例直接复用。

我们前面已经学到,一个UIAbility对标的是一个任务管理器中的任务,这里跟Android的Activity还是存在区别的。如果一个HarmonyOs应用里面存在多个UIAbility,并且全部打开了,当用户退出界面选择任务列表的时候,您会发现存在很多任务,这原则上讲是很乱的。所以HarmonyOs的默认模式为singleton是有道理的。

如图所示,存在两个UIAbility,您的列表就是两个。非必要不要这个样子。

注意事项

应用的UIAbility实例已创建,该UIAbility配置为单实例模式,再次调用startAbility()方法启动该UIAbility实例。由于启动的还是原来的UIAbility实例,并未重新创建一个新的UIAbility实例,此时只会进入该UIAbility的onNewWant()回调,不会进入其onCreate()和onWindowStageCreate()生命周期回调。

multiton启动模式

又称为多实例启动模式,这个的表现是每次开启一个UIAbility,系统不会查看系统中有没有已有的实例对象,直接就是创建,全部都是新的,也就是走全生命周期流程。当然此时如果频繁的创建,您在任务列表中。

这么乱什么时候会用到呢?

有个场景是,您写的App,必须要两个界面同时都在,这样才能使得用户体验良好的情况下,它就适合,比如,微信聊天,开着视频,要么小窗,要么就开俩大窗。就是涉及多窗口的情况下需要用到这个。另外对于一些跨设备协同的情景也需要这个。

specified启动模式

specified指定实例模式。可以理解为一个可以复用的意图模式。总共分为两大特点

  • 它的开启,需要在调用方传入意图信息,还记得onCreate()函数中有一个叫want的参数么?就是和这个有关的。
  • 它一旦被开启,除非实例被销毁掉,当下次用户再打开同样的调用时,传入同样的内容,便会像singleton模式那样进行复用。

举个例子:

文档应用中每次新建文档希望都能新建一个文档实例,重复打开一个已保存的文档希望打开的都是同一个文档实例。这个现象在电脑中很常见。

对于那些被定义为specified的UIAbility,这就有点参与招标的企业乙方,甲方投标,如果乙方的要求都符合,可以参与招标,全都符合比较满意就中标。

对于调用方而言,也就是甲方,首先会拿到当下功能需要的特征(意图),然后根据这个意图,而选择开启哪个响应这种意图的UIAbility。如果这个UIAbility存在的话,就复用,不走onCreate流程,回调onNewWant()。如果不存在,就会创建一个实例,走生命周期。

如图所示,假设UIAbilityA是开启方,UIAbilityB是被开启方,且模式是specified。

其中KEY,是识别出是否存在符合的Activity的核心。我们用代码体会一下这些逻辑片段,看看是怎么利用它的。

1 首先我们先给UIAbilityB进行设置,来说明这是一个指定实例模式。

{"module": {// ..."abilities": [{"launchType": "specified",// ...}]}
}

2 对于开启方UIAbilityA而言,当打开UIAbilityB的时候,设置代码如下

let context : common.UIAbilityContext = getContext(this) as common.UIAbilityContext
let want : Want = {deviceId : '', //空字串代表是本设备,意味着,别的设备也行。bundleName: 'com.samples.stagemodelabilitydevelop', //bundle之前提到过,涉及到的所有模块包合起来形成一个bundleabilityName : 'UIAbilityB',moduleName : 'entry', //entry包,符合bundle的特点,可以包含许多模块包parameters : {instanceKey : this.KEY_NEW //自定义的值}context.startAbility(want).then(()=> {hilog.info(DOMAN_NUMBER, TAG, 'Successed in starting UIAbilityB')})
}

3 当UIAbilityA在开启时,会检索系统中有没有符合标准的UIAbilityB,如果有,会回调UIAbility的onNewWant()函数。那么我们应该做的是在AbilityStage文件中,这个回调里做相应的逻辑。

onAcceptWant(want: Want): string {// 在被调用方的AbilityStage中,针对启动模式为specified的UIAbility返回一个UIAbility实例对应的一个Key值// 当前示例指的是module1 Module的SpecifiedAbilityif (want.abilityName === 'UIAbilityB') {// 返回的字符串KEY标识为自定义拼接的字符串内容if (want.parameters) {return `SpecifiedAbilityInstance_${want.parameters.instanceKey}`;}}// ...return 'MyAbilityStage';}

4 当UIAbilityB被调用之后,如果以后再有机会调用,那么UIAbilityB会被复用,马上回调onForground() . 所以一旦匹配上就会开一个窗口,除非匹配不上key,会开启一个新的UIAbilityB的窗口,并将Key记录住。我们看步骤3出处也会发现,匹配实则是一个严格匹配。返回的字符串,就是为了系统管理映射,有的话,找老的实例回复,没有的话,就新建一个。


http://www.ppmy.cn/server/176904.html

相关文章

2025,游戏出海的致命伤

据最新发布的《2025年1月中国游戏产业月度报告》,仅今年 1 月,中国自研游戏海外收入就同比暴涨 28.65%,突破 16.75 亿美元。《原神》《鸣潮》创下的佳绩之外,中轻度 SLG《小舰舰超勇》空降美国下载榜,一举占据 TOP 10 …

17.1Go语言操作MongoDB

驱动安装 go get go.mongodb.org/mongo-driver/mongo基础连接示例 package mainimport ("context""fmt""log""time""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options" )func mai…

OpenCV计算摄影学(23)艺术化风格化处理函数stylization()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 风格化的目的是生成不以照片写实为目标的多种多样数字图像效果。边缘感知滤波器是风格化处理的理想选择,因为它们能够弱化低对比度区…

Flutter Dart 异步支持全面解析

引言 在 Flutter 开发中,Dart 语言提供了强大的异步支持机制。异步编程能够让程序在执行耗时操作(如网络请求、文件读写等)时,不会阻塞主线程,从而保证用户界面的流畅性和响应性。本文将详细介绍 Dart 中常见的异步编…

人工智能实现电脑任务自动化的开源软件

人工智能实现电脑任务自动化的开源软件 hallo大家好,我是星哥,今天给大家介绍一个开源软件,融合了人工智能与机器人流程自动化(AIRPA)的开源软件autoMate! autoMate是什么 autoMate 是一款由开源开发的本地自动化工…

从零开始写C++3D游戏引擎(开发环境VS2022+OpenGL)之十一 从打光到材质 细嚼慢咽逐条读代码系列

写在篇前的话 作为一个曾经在代码堆里面苦苦挣扎的萌新,困惑的事情在于库,各种依赖,包换文件,链接库,纠结于代码的作用意义。尤其在3D引擎开发的问题上,很多人都被各种困难给阻拦,放弃了在3D渲染,3D游戏引擎上大涨鸿图的机会。 当然关于3D游戏引擎的教程已经汗牛充栋…

Spring MVC 拦截器使用

javaweb过滤器和springmvc拦截器: 拦截器的概念 拦截器使用 1/创建拦截器类,类中实现 handler执行前,执行后与渲染视图后的具体实现方法 public class GlobalExceptionHandler implements HandlerInterceptor {// if( ! preHandler()){re…

【CSS文字渐变动画】

CSS文字渐变动画 HTML代码CSS代码效果图 HTML代码 <div class"title"><h1>今天是春分</h1><p>正是春天到来的日子&#xff0c;花都开了&#xff0c;小鸟也飞回来了&#xff0c;大山也绿了起来&#xff0c;空气也有点嫩嫩的气息了</p>…