鸿蒙 Stage模型-AbilityStage、Context、Want

前提:基于官网3.1/4.0文档。参考官网文档
基于Android开发体系来进行比较和思考。(或有偏颇,自行斟酌)

一、 AbilityStage

1.概念

AbilityStage是一个Module级别的组件容器,应用的HAP在首次加载时会创建一个AbilityStage实例,可以对该Module进行初始化等操作。
AbilityStage与Module一一对应,即一个Module拥有一个AbilityStage。

类同Application

2.功能与使用

1. 配置

module.json5中:

{
  "module": {
    "name": "entry",
    "type": "entry",
    "srcEntry": "./ets/myabilitystage/MyAbilityStage.ts",
    ...
  }
}

2.使用

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

export default class MyAbilityStage extends AbilityStage {
  onCreate() {
    // 应用的HAP在首次加载的时,为该Module初始化操作
  }
  onAcceptWant(want) {
    // 仅specified模式下触发
    return "MyAbilityStage";
  }
}
  1. onCreate()生命周期回调:在开始加载对应Module的第一个UIAbility实例之前会先创建AbilityStage,并在AbilityStage创建完成之后执行其
    onCreate()生命周期回调。AbilityStage模块提供在Module加载的时候,通知开发者,可以在此进行该Module的初始化(如资源预加载,线程创建等)能力。
  2. onAcceptWant()事件回调:UIAbility指定实例模式(specified)启动时候触发的事件回调,具体使用请参见UIAbility启动模式综述。
  3. onConfigurationUpdated()事件回调:当系统全局配置发生变更时触发的事件,系统语言、深浅色等,配置项目前均定义在Configuration类中。
  4. onMemoryLevel()事件回调:当系统调整内存时触发的事件。

二、Context

1.概念

在这里插入图片描述

在这里插入图片描述

2.功能与使用

与Android类似。

三、Want

1.概念

Want是对象间信息传递的载体,可以用于应用组件间的信息传递。其使用场景之一是作为startAbility()的参数,包含了指定的启动目标以及启动时需携带的相关数据,如bundleName和abilityName字段分别指明目标Ability所在应用的包名以及对应包内的Ability名称。当UIAbilityA启动UIAbilityB并需要传入一些数据给UIAbilityB时,Want可以作为一个载体将数据传给UIAbilityB。
在这里插入图片描述
类似Android中的Bundle。

2.功能与使用

1.显式与隐式规则

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
传递的数据包含参数:
deviceId、bundleName、moduleName、abilityName、uri、type、action、entities、flags、parameters。
其中abilityName指定了值则为显式规则,否则为隐式规则。

匹配规则偏向于正则表达式匹配规则、包含关系。

2.action与entities

action

表示调用方要执行的通用操作(如查看、分享、应用详情)
ACTION_HOME:启动应用入口组件的动作,需要和ENTITY_HOME配合使用;
ACTION_CHOOSE:选择本地资源数据,例如联系人、相册等;
ACTION_VIEW_DATA:查看数据,当使用网址uri时,则表示显示该网址对应的内容。
ACTION_VIEW_MULTIPLE_DATA:发送多个数据记录的操作

entities

表示目标Ability的类别信息(如浏览器、视频播放器),在隐式Want中是对action的补充。在隐式Want中,开发者可定义该字段,来过滤匹配应用的类别,例如必须是浏览器。在Want内声明entities字段表示希望被调用方应用属于声明的类别。在被调用方应用配置文件skills字段内声明entites表示该应用支持的类别。
ENTITY_DEFAULT:默认类别无实际意义。
ENTITY_HOME:主屏幕有图标点击入口类别。
ENTITY_BROWSABLE:指示浏览器类别。

action ->action
entities -> intent-filter?

3.案例

1.显式跳转

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

// ...
  async explicitStartAbility() {
    try {
      // Explicit want with abilityName specified.
      let want = {
        deviceId: "",
        bundleName: "com.example.myapplication",
        abilityName: "calleeAbility"
      };
      let context = getContext(this) as common.UIAbilityContext;
      await context.startAbility(want);
      console.info(`explicit start ability succeed`);
    } catch (error) {
      console.info(`explicit start ability failed with ${error.code}`);
    }
  }
// ...

注意这里对调用方法使用了asyncawait。归根到底应该是使用了await导致整个方法是asyncstartAbility是异步的的好理解,但是为什么要单独加上那个await修饰符呢?

2.隐式跳转
1.被调用放设置

"skills": [
  {
    "entities": [
      "entity.system.browsable"
      // ...
    ],
    "actions": [
        "ohos.want.action.viewData"
        // ...
    ],
    "uris": [
      {
        "scheme": "https",
        "host": "www.test.com",
        "port": "8080",
        // prefix matching
        "pathStartWith": "query",
        "type": "text/*"
      },
      {
        "scheme": "http",
        // ...
      }
      // ...
    ]
  },
]
  1. 调用方调用
    async implicitStartAbility() {
        try {
            let want = {
                // uncomment line below if wish to implicitly query only in the specific bundle.
                // bundleName: "com.example.myapplication",
                "action": "ohos.want.action.viewData",
                // entities can be omitted.
                "entities": [ "entity.system.browsable" ],
                "uri": "https://www.test.com:8080/query/student",
                "type": "text/plain"
            }
            let context = getContext(this) as common.UIAbilityContext;
            await context.startAbility(want)
            console.info(`explicit start ability succeed`)
        } catch (error) {
            console.info(`explicit start ability failed with ${error.code}`)
        }
     }

匹配规则为链式,顺序为:action->entities->urls->type,满足前序条件才能进行到后续匹配。

四、总结

AbilityStage->Application
Context->Contenxt
Want->Bundle

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/430858.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么写苹果群控核心功能的源代码!

随着移动设备的普及和技术的不断发展,苹果设备群控技术成为了许多开发者关注的焦点,苹果群控技术允许开发者通过编写源代码,实现对多台苹果设备的集中管理和控制。 一、了解苹果群控技术的基本原理 在编写苹果群控核心功能的源代码之前&…

书生浦语全链路开源体系

推荐阅读论文 A Survey Of Large Language Models 书生浦语开源的模型 从模型到应用 书生浦语开源体系 书生万卷开源数据集 除此之外还有OpenDataLab国内数据集下载网站。 预训练框架InterLM-Train 微调框架XTuner 评测工具体系 国内外常见的大语言模型评测基准&#xff1a…

YOLOv8独家原创改进:特征融合涨点篇 | 广义高效层聚合网络(GELAN) | YOLOv9

💡💡💡本文独家改进:即结合用梯度路径规划(CSPNet)和(ELAN)设计了一种广义的高效层聚合网络(GELAN),高效结合YOLOv8,实现涨点。 将GELAN添加在backbone和head处,提供多个yaml改进方法 💡💡💡在多个私有数据集和公开数据集VisDrone2019、PASCAL VOC实现…

基于华为atlas的unet分割模型探索

Unet模型使用官方基于kaggle Carvana Image Masking Challenge数据集训练的模型。 模型输入为572*572*3,输出为572*572*2。分割目标分别为,0:背景,1:汽车。 Pytorch的pth模型转化onnx模型: import torchf…

bun 单元测试

bun test Bun 附带了一个快速、内置、兼容 Jest 的测试运行程序。测试使用 Bun 运行时执行,并支持以下功能。 TypeScript 和 JSX生命周期 hooks快照测试UI 和 DOM 测试使用 --watch 的监视模式使用 --preload 预加载脚本 Bun 旨在与 Jest 兼容,但并非所…

北京Excel表格线下培训班

Excel培训目标 熟练掌握职场中Excel所需的公式函数计算,数据处理分析,各种商务图表制作、动态仪表盘的制作、熟练使用Excel进行数据分析,处理,从复杂的数据表中把数据进行提取汇总 Excel培训形式 线下面授5人以内小班&#xff…

分享Web.dev.cn中国开发者可以正常访问

谷歌开发者很高兴地宣布,web.dev 和 Chrome for Developers 现在都可以通过 .cn 域名访问,这将帮助中国的开发者更加容易获取我们的内容。 在 .cn 域名上,我们已向您提供所有镜像后的内容,并提供支持的语言版本。 Web.dev 中国开…

uipath调用js代码

1,调用js代码,不带参数,没有返回值 为了去掉按钮的disabled属性 function(){ document.getElementsByClassName(submitBtn)[0].removeAttribute(disabled); } 2,调用js代码,带参数,没有返回值 输入参数&a…

el-dialog封装组件

父页面 <template><div><el-button type"primary" click"visible true">展示弹窗</el-button><!-- 弹窗组件 --><PlayVideo v-if"visible" :visible.syncvisible /></div> </template><sc…

Python-Numpy-计算向量间的欧式距离

两个向量间的欧式距离公式&#xff1a; a np.array([[2, 2], [4, 5], [6, 7]]) b np.array([[1, 1]]) # 使用L2范数计算 dev1 np.linalg.norm(a - b, ord2, axis1) # 使用公式计算 dev2 np.sqrt(np.sum((a - b) ** 2, axis1)) print(dev1.reshape((-1, 1)), dev2.reshape((…

掌握WhatsApp手机号质量评分:增加信息可达性

WhatsApp手机号质量评分是用于衡量用户手机号与平台互动的健康度&#xff0c;确保用户通讯时的合规性和安全性。在实掌握WhatsApp手机号质量评分实际应用中&#xff0c;这个评分会影响用户的消息发送的可达性。高质量的评分意味着用户的账户被视为可信赖的&#xff0c;其发送的…

2024最新ChatGPT网站源码, AI绘画系统

一、前言说明 R5Ai创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GP…

平替电容笔推荐:2024五大高口碑电容笔机型别错过!

现在电容笔已成为许多人工作、学习和创作的重要配件之一&#xff0c;它可以很好的提高我们的书写、绘画效率&#xff0c;无纸化学习也能减轻我们书本重量&#xff0c;让学习更加高效&#xff0c;然而&#xff0c;市场上电容笔种类繁&#xff0c;也少不了一些质量不佳的产品&…

掼蛋“六必治”策略

“六必治”&#xff0c;即是指当对手手中只剩下六张牌的时候&#xff0c;我们不管是用炸弹还是登基牌还是其他大牌都要及时压制对手&#xff0c;夺得出牌权&#xff0c;不能让他再次出牌&#xff0c;防止他有一手整牌或者一炸加上一手牌。 对手剩六张牌&#xff0c;有以下几种情…

正大国际:期货结算价是如何理解呢?结算价有什么作用?

如何理解期货结算价&#xff1a; 什么是商品期货当日结算价&#xff0c; 商品期货当日结算价是指某一期货合约当日交易期间成交价格按成交量的加权平均价。当日 无成交的&#xff0c;当日结算价按照交易所相关规定确定。 股指期货当日结算价是指某一期货合约当日交易期间最后一…

The Design and Implementation of a Capacity-Variant Storage System——论文泛读

FAST 2024 Paper 分布式元数据论文整理 问题 随着SSD的使用&#xff0c;其性能稳步下降。如图1所示&#xff0c;SSD的性能随着SSD的磨损的下降率为4.2%&#xff0c;吞吐量下降不太可能是由于垃圾收集造成的&#xff0c;因为&#xff08;1&#xff09;这是几个月来每天测量的&…

手写分布式配置中心(二)实现分布式配置中心的简单版本

这一篇文章比较简单&#xff0c;就是一个增删改查的服务端和一个获取配置的客户端&#xff0c;旨在搭建一个简单的配置中心架构&#xff0c;代码在 https://gitee.com/summer-cat001/config-center 服务端 服务端选择用springboot 2.7.14搭建&#xff0c;设计了4个接口/confi…

Guava处理异常

guava由Google开发&#xff0c;它提供了大量的核心Java库&#xff0c;例如&#xff1a;集合、缓存、原生类型支持、并发库、通用注解、字符串处理和I/O操作等。 异常处理 传统的Java异常处理通常包括try-catch-finally块和throws关键字。 遇到FileNotFoundException或IOExce…

49、WEB攻防——通用漏洞业务逻辑水平垂直越权访问控制脆弱验证

文章目录 前置知识点水平越权——YXCMS 前置知识点 逻辑越权原理&#xff1a; 水平越权&#xff1a;同级用户权限共享。用户信息获取时未对用户与ID比较判断直接查询等&#xff1b;垂直越权&#xff1a;低高级用户权限共享。数据库中用户类型编号接受篡改或高权限未作验证等。 …

Unity 使用AddListener监听事件与取消监听

在Unity中&#xff0c;有时候我们会动态监听组件中的某个事件。当我们使用代码动态加载多次&#xff0c;每次动态加载后我们会发现原来的和新的事件都会监听&#xff0c;如若我们只想取代原来的监听事件&#xff0c;那么就需要取消监听再添加监听了。 如实现如下需求&#xff…