HarmonyOS/OpenHarmony应用开发-Stage模型UIAbility组件使用(二)

news/2024/7/21 10:41:21 标签: HarmonyOS

UIAbility组件启动模式
UIAbility的启动模式是指UIAbility实例在启动时的不同呈现状态。针对不同的业务场景,系统提供了三种启动模式:

singleton(单实例模式)
standard(标准实例模式)
specified(指定实例模式)
一、singleton启动模式
singleton启动模式为单实例模式,也是默认情况下的启动模式。
每次调用startAbility()方法时,如果应用进程中该类型的UIAbility实例已经存在,则复用系统中的UIAbility实例。系统中只存在唯一一个该UIAbility实例,即在最近任务列表中只存在一个该类型的UIAbility实例。
图1 单实例模式演示效果


说明
应用的UIAbility实例已创建,该UIAbility配置为单实例模式,再次调用startAbility()方法启动该UIAbility实例,此时只会进入该UIAbility的onNewWant()回调,不会进入其onCreate()和onWindowStageCreate()生命周期回调。
如果需要使用singleton启动模式,在module.json5配置文件中的"launchType"字段配置为"singleton"即可。

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

二、standard启动模式
standard启动模式为标准实例模式,每次调用startAbility()方法时,都会在应用进程中创建一个新的该类型UIAbility实例。即在最近任务列表中可以看到有多个该类型的UIAbility实例。这种情况下可以将UIAbility配置为standard(标准实例模式)。
图2 标准实例模式演示效果


standard启动模式的开发使用,在module.json5配置文件中的"launchType"字段配置为"standard"即可。

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

三、specified启动模式
specified启动模式为指定实例模式,针对一些特殊场景使用(例如文档应用中每次新建文档希望都能新建一个文档实例,重复打开一个已保存的文档希望打开的都是同一个文档实例)。
在UIAbility实例创建之前,允许开发者为该实例创建一个唯一的字符串Key,创建的UIAbility实例绑定Key之后,后续每次调用startAbility()方法时,都会询问应用使用哪个Key对应的UIAbility实例来响应startAbility()请求。运行时由UIAbility内部业务决定是否创建多实例,如果匹配有该UIAbility实例的Key,则直接拉起与之绑定的UIAbility实例,否则创建一个新的UIAbility实例。
图3 指定实例模式演示效果


说明
应用的UIAbility实例已创建,该UIAbility配置为指定实例模式,再次调用startAbility()方法启动该UIAbility实例,且AbilityStage的onAcceptWant()回调匹配到一个已创建的UIAbility实例。此时,再次启动该UIAbility时,只会进入该UIAbility的onNewWant()回调,不会进入其onCreate()和onWindowStageCreate()生命周期回调。
例如有两个UIAbility:EntryAbility和FuncAbility,FuncAbility配置为specified启动模式,需要从EntryAbility的页面中启动FuncAbility。
1.在FuncAbility中,将module.json5配置文件的"launchType"字段配置为"specified"。

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

2.在EntryAbility中,调用startAbility()方法时,在want参数中,增加一个自定义参数来区别UIAbility实例,例如增加一个"instanceKey"自定义参数。

// 在启动指定实例模式的UIAbility时,给每一个UIAbility实例配置一个独立的Key标识
// 例如在文档使用场景中,可以用文档路径作为Key标识
function getInstance() {
    // ...
}

let want = {
    deviceId: '', // deviceId为空表示本设备
    bundleName: 'com.example.myapplication',
    abilityName: 'FuncAbility',
    moduleName: 'module1', // moduleName非必选
    parameters: { // 自定义信息
        instanceKey: getInstance(),
    },
}
// context为调用方UIAbility的AbilityContext
this.context.startAbility(want).then(() => {
    // ...
}).catch((err) => {
    // ...
})

3.由于FuncAbility的启动模式配置为了指定实例启动模式,在FuncAbility启动之前,会先进入其对应的AbilityStage的onAcceptWant()生命周期回调中,解析传入的want参数,获取"instanceKey"自定义参数。根据业务需要通过AbilityStage的onAcceptWant()生命周期回调返回一个字符串Key标识。如果返回的Key对应一个已启动的UIAbility,则会将之前的UIAbility拉回前台并获焦,而不创建新的实例,否则创建新的实例并启动。

import AbilityStage from '@ohos.app.ability.AbilityStage';

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

        return '';
    }
}

例如在文档应用中,可以对不同的文档实例内容绑定不同的Key值。当每次新建文档的时候,可以传入不同的新Key值(如可以将文件的路径作为一个Key标识),此时AbilityStage中启动UIAbility时都会创建一个新的UIAbility实例;当新建的文档保存之后,回到桌面,或者新打开一个已保存的文档,回到桌面,此时再次打开该已保存的文档,此时AbilityStage中再次启动该UIAbility时,打开的仍然是之前原来已保存的文档界面。
以如下步骤所示进行举例说明。

第一步打开文件A,对应启动一个新的UIAbility实例,例如启动“UIAbility实例1”。

第二步在最近任务列表中关闭文件A的进程,此时UIAbility实例1被销毁,回到桌面,再次打开文件A,此时对应启动一个新的UIAbility实例,例如启动“UIAbility实例2”。

第三步回到桌面,打开文件B,此时对应启动一个新的UIAbility实例,例如启动“UIAbility实例3”。

第四步回到桌面,再次打开文件A,此时对应启动的还是之前的“UIAbility实例2”。


http://www.niftyadmin.cn/n/1448852.html

相关文章

sql server加密与sql注入(转)

sql server上的加密 sql server上内置了加密用来保护各种类型的敏感数据。在很多时候,这个加密对于你来说是完全透明的;当数据被存储时候被加密,它们被使用的时候就会自动加密。在其他的情况下,你可以选择数据是否要被加密。sql …

(原+转)简明 Python 教程:总结

简明 Python 教程 说明:本文只是对《简明Python教程》的一个总结。请搜索该书查看真正的教程。 第3章 最初的步骤 1. Python是大小写敏感的。 2. 在#符号右面的内容都是注释 3. Python至少应当有第一行那样的特殊形式的注释。它被称作组织行——源文件的头两个字符是…

uva 1546 - Complete the sequence!(牛顿插值法)

题目连接:uva 1546 - Complete the sequence! 题目大意:给出一个序列的n项,求满足序列规律的后c项,要求尽量小。 解题思路:牛顿插值法,每次求两项之间的差,形成一个新的序列,直到序列…

平湖国美网吧采用艾泰路由器后的革新(转)

概述  浙江国美网吧坐落于经济蓬勃发展的嘉兴平湖市,营业面积有500多平方米,电脑数量达270多台。国美网吧的老板一直对接入设备的性能、稳定性等相当重视,采用艾泰HiPER宽带安全网关之前,已经频繁更换过好几个品牌的产品&#x…

uva 684 - Integral Determinant(行列式求值)

题目连接:uva 684 - Integral Determinant 题目大意:给定一个行列式,求行列式的值。 解题思路:将行列式转化成上三角的形式,值即为对角线上元素的积。因为要消元,又是整数,所以用分数去写了。 …

Linux+Apache+MySQL+PHP+FrontPage完全安装手册(转)

本文介绍如何安装Apache以支持MySQL、PHP4、FrontPage2000服务器扩展和虚拟主机功能,本文的安装步骤在Redhat 7.0和Mandrake 7.2上测试通过,所以应该适用于任何Linux发行,它也适用于任何形式的*nix系统,只要下载不同的软件包。 一…

梦幻星空动画

梦幻星空动画 http://code4app.com/ios/%E6%A2%A6%E5%B9%BB%E6%98%9F%E7%A9%BA%E5%8A%A8%E7%94%BB/53a52747933bf051468b5b51 效果如下图: 效果是别人做的,非本人所写,本人只是分析下实现原理而已:) 代码原理: 1. 所有的View都将backedLayer替换成了粒子Layer 2. 粒子随着路径运…

Access2003开发者扩展工具集概述(转)

许可和分发权限 Access 2003 Developer Extensions随附的许可协议简化了解决方案或代码段的分发过程。这些协议包括免版税的Access运行时,您可以分发Access解决方案和Access数据项目,以及免费使用和分发工具源代码部分以作为您的解决方案的一部分。 轻松…