HarmonyOS应用开发-Stage模型开发概述

基本概念

UI框架

HarmonyOS提供了一套UI开发框架,即方舟开发框架(ArkUI框架)。提供了应用UI开发所必需的能力:多种组件、布局计算、动画能力、UI交互、绘制。
方舟开发框架针对开发者提供了两种开发范式:

  • 基于ArkTS的声明式开发范式,使用ArkTS语言,适用于复杂度较大、团队合作度较高的程序;适用移动系统应用开发人员、系统应用开发人员。
  • 兼容JS的类Web开发范式,使用JS语言,适用于界面较为简单的程序应用和卡片;适用Web前端开发人员。

应用模型

应用模型是HarmonyOS为开发者提供的应用程序所需能来的抽象提炼,它提供了应用程序必备的组件和运行机制。开发者可以基于一套统一的模型进行应用开发,使应用开发更简单、高效。
现在主要使用Stage模型,在该模型中,由于提供了AbilityStage、WindowStage类作为应用组件和Windows窗口的“舞台”。

Stage模型

Stage模型概念图
image.png

Stage模型提供UIAbility和ExtensionAbility两种类型的组件,这两种组件都有具体的类承载,支持面向对象的开发方式。

界面组件(Ability

  • UIAbility组件是包含UI界面的应用组件,主要用于和用户交互。像Android中的Activity。也有自己的生命周期,不同的是UIAbility的生命周期只包含创建/销毁/前台/后台等状态,与显示相关的状态通过WindowStage的事件暴露出来。

image.png

  • ExtensionAbility组件是一种面向特定场景的应用组件。一般都是使用**UIAbility,**等具体用到再说。

WindowStage

每个UIAbility类实例都会与一个WindowStage类实例绑定,该类提供了应用进程内窗口管理器的作用。它包含一个主窗口。也就是说UIAbility通过WindowStage持有了一个窗口,该窗口为ArkUI提供了绘制区域。

Context

Context及其派生类向开发者提供在运行期可以调用的各种能力。UIAbility组件和各种ExtensionAbility派生类都有各自不同的Context类,他们都继承自基类Context,但是各自又根据所属组件,提供不同的能力。
目前我理解同Android中的Context上下文,后面再看。
image.png

AbilityStage

每个Entry类型或者Feature类型的HAP在运行期都有一个AbilityStage类实例,当HAP中的代码首次被加载到进程中的时候,系统会先创建AbilityStage实例。每个在该HAP中定义的UIAbility类,在实例化后都会与该实例产生关联。开发者可以使用AbilityStage获取该HAP中UIAbility实例的运行时信息。

Stage模型开发流程

作为开发者,在基于Stage模型进行开发应用时,需要学习了解如下流程:

  • 应用组件开发
    • 应用、组件级配置
    • UIAbility组件等其他组件
    • AbilityStage
    • 上下文Context
  • 了解进程模型
    • 进程模型和进程间通信方式
  • 了解线程模型
    • 线程模型和线程间通信方式
  • 应用配置文件
    • 配置文件中各个配置项

配置文件

配置文件简述

在应用开发过程中,需要对应用进行配置,如应用名称、应用包名、应用图标等设置。在HarmonyOS应用中分为2个层面的配置:

  • 应用层面,应用的图标、应用名称。在设置应用中(应用管理)中使用。其在app.json5配置文件中。
  • 入口页面层面,入口页面的图标、入口名称。在应用安装完成后在设备桌面上显示。其在module.json5配置文件中。**入口图标是以UIAbility为粒度,支持同一个应用存在多个入口图标和标签,点击后进入对应的UIAbility界面。**这个和Android不一样,Android应用只有一个入口。

image.png

应用级配置

在工程的AppScope目录下的app.json5配置文件中配置。
一般需要关注如下配置:

  • bundleName,包名,标识应用的唯一性。同Android上的packageId
  • icon,应用图标
  • label,应用标签(应用名称)
  • versionCode,应用版本号

app.json5配置示例:

{
  "app": {
    "bundleName": "com.example.myapplication",
    "vendor": "example",
    "versionCode": 1000000,
    "versionName": "1.0.0",
    "icon": "$media:app_icon",
    "label": "$string:app_name"
  }
}

入口页面级配置

入口图标和入口标签(入口名称)会显示在桌面上。入口页面级配置在module.json5配置文件中配置。

需要关注如下配置:

  • abilities下的icon,入口图标
  • abilities下的label,入口标签(入口名称)

module.json5配置文件示例:

{
  "module": {
    "name": "entry",
    "type": "entry",
    "description": "$string:module_desc",
    "mainElement": "EntryAbility",
    "deviceTypes": [
      "phone",
      "tablet"
    ],
    "deliveryWithInstall": true,
    "installationFree": false,
    "pages": "$profile:main_pages",
    "abilities": [
      {
        // UIAbility组件的名称
        "name": "EntryAbility",
        // UIAbility组件的代码路径
        "srcEntry": "./ets/entryability/EntryAbility.ts",
        // UIAbility组件的描述信息
        "description": "$string:EntryAbility_desc",
        // UIAbility组件的图标
        "icon": "$media:icon",
        // UIAbility组件的标签
        "label": "$string:EntryAbility_label",
        // UIAbility组件启动页面图标资源文件的索引
        "startWindowIcon": "$media:icon",
        // UIAbility组件启动页面背景颜色资源文件的索引
        "startWindowBackground": "$color:start_window_background",
        "exported": true,
        "skills": [
          {
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "action.system.home"
            ]
          }
        ]
      }
    ]
  }
}

UIAbility组件

UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互。
具体代码示例:
EntryAbility.ets

import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';

export default class EntryAbility extends UIAbility {
  onCreate(want, launchParam) {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }

  onDestroy() {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage) {
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/Index', (err, data) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
    });
  }

  onWindowStageDestroy() {
    // Main window is destroyed, release UI related resources
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground() {
    // Ability has brought to foreground
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground() {
    // Ability has back to background
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }
}

UIAbility的生命周期

UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态,如下图所示:
image.png

WindowStageCreate和WindowStageDestroy状态

UIAbility实例创建完成之后,在进入Foreground之前,系统会创建一个WindowStage。WindowStage创建完成后会进入onWindowStageCreate()回调,可以在该回调中设置UI界面加载、设置WindowStage的事件订阅。
image.png

UIAbility组件启动模式

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

  • singleton(单实例模式),默认模式
  • multiton(多实例模式)
  • specified(指定实例模式)

在module.json5配置文件中的"launchType"字段配置:

{
  "module": {
    // ...
    "abilities": [
      {
        // 设置启动模式
        "launchType": "singleton",
        // ...
      }
    ]
  }
}

指定UIAbility的启动页面

应用中的UIAbility在启动过程中,需要指定启动页面,否则应用启动后会因为没有默认加载页面而导致白屏。可以在UIAbility的onWindowStageCreate()生命周期回调中,通过WindowStage对象的loadContent()方法设置启动页面。

import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';

export default class EntryAbility extends UIAbility {
  //...

  onWindowStageCreate(windowStage: window.WindowStage) {
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/Index', (err, data) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
    });
  }
  //...
}

获取UIAbility的上下文信息

通过UIAbilityContext可以获取UIAbility的相关配置信息,如包代码路径、Bundle名称、Ability名称和应用程序需要的环境状态等属性信息,以及可以获取操作UIAbility实例的方法(如startAbility()、connectServiceExtensionAbility()、terminateSelf()等)

在UIAbility中可以通过this.context获取UIAbility实例的上下文信息。

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

export default class EntryAbility extends UIAbility {
    onCreate(want, launchParam) {
        // 获取UIAbility实例的上下文
        let context = this.context;

        // ...
    }
}

在页面中获取UIAbility实例的上下文信息,包括导入依赖资源context模块和在组件中定义一个context变量两个部分。

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

@Entry
@Component
struct Index {
  private context = getContext(this) as common.UIAbilityContext;

  startAbilityTest() {
    let want = {
      // Want参数信息
    };
    this.context.startAbility(want);
  }

  // 页面展示
  build() {
    // ...
  }
}

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

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

相关文章

springboot换日志框架后爆SLF4J: Class path contains multiple SLF4J bindings的解决办法

sringboot原本使用的是logback日志框架,将它去掉,修改为log4j2日志框架后,往往会出现以下错误: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/C:/Users/admin/.m2/repository/ch/qos…

java虚拟机的堆核心知识介绍

Java虚拟机(JVM)的堆(Heap)是Java内存模型中一个至关重要的部分。它是运行时数据区,用于存储Java对象实例。堆是垃圾收集器工作的地方,也是Java应用程序内存管理的关键区域。在本教程中,我们将深…

uniapp h5 部署

uniapp 配置 服务器文件路径 打包文件结构 //nginx 配置 server {listen 8300;server_name bfqcwebsiteapp;charset utf-8;#允许跨域请求的域,* 代表所有add_header Access-Control-Allow-Origin *;#允许带上cookie请求add_header Access-Control-Allow-C…

【SQL Server】实验四 数据更新

1 实验目的 掌握SQL数据更新语句的基本使用方法,如UPDATE、DELETE、INSERT。掌握更新语句条件中的嵌套查询使用方法。 2 实验内容 2.1 掌握SQL更新语句的基本使用方法 INSERT基本语句。UPDATE基本语句。DELETE基本语句。 2.2 掌握SQL更新语句的高级使用方法 …

汽车电子零部件(3):ADAS前视感知系统FLC

前言: 比如车道保持和车道改变这种场景,如何进行车道的识别,如何进行周围车辆的识别,这算是ADAS中的一个场景,其中就会用到FLC前视感知系统。还有比如前向物体识别,前向车辆识别等。 再往大里说那就是车联网了: 除了前向也可能有其他部位

【计算机网络篇】计算机网络的性能指标

文章目录 🍔计算机网络的性能指标🗃️常见的计算机网络性能指标⭐速率⭐带宽⭐吞吐量⭐时延⭐时延带宽积⭐往返时间⭐利用率⭐丢包率 🔎总结 🍔计算机网络的性能指标 计算机网络的性能指标被用来从不同方面度量计算机网络的性能 …

如何通过做自己喜欢的事来赚钱?

今天想要跟大家分享一本我今年反复读过最多次的一本书《The Almanack of Naval Ravikant 纳瓦尔宝典》。我之前也有介绍过Naval Ravikant,他是硅谷创业界的一位传奇人物,创办了知名的天使投资平台AngelList。早期他还投资超过了200家科技公司,其中很多都成为了今天的科技巨头…

SpringBoot集成Redisson实现接口限流

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Dat…

MIT 6.S081---Lab: locks

Memory allocator (moderate) 修改kernel/kalloc.c,修改kmem声明并定义结构体数组: 修改kernel/kalloc.c中的kinit函数,对kmemList进行初始化: 修改kernel/kalloc.c中的kfree函数,获取当前的cpuid并将释放的内存添加到…

Ubuntu Linux - Primavera P6 EPPM 安装及分享

引言 根据计划,近日我制作了基于Ubuntu Linux 的P6虚拟机环境,同样里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机,请先与Oracle Primavera销售代表取得联系,以获取所需的应…

抖音获得抖音商品详情 API 返回值说明

抖音(Douyin)的商品详情API返回值通常会包含有关商品的详细信息。这些信息可能包括但不限于商品ID、商品名称、商品价格、商品图片、商品描述、商品销售属性等。以下是一个简化的抖音商品详情API返回值示例和说明: 调用链接获取详情 item_g…

江科大stm32学习笔记【6-2】——定时器定时中断定时器外部时钟

一.定时器定时中断 1.原理 2.硬件 3.程序 此时CK_PSC72M,定时1s,也就是定时频率为1Hz,所以可以PSC7200-1,ARR10000-1。 Timer.c: #include "stm32f10x.h" // Device headerextern uint16_t Num;//声明跨文件的…

2024大广赛朗圣药业都有哪些命题?

大广赛官网网站在3月8日公布了朗圣药业2024年的赛事命题,本文就给大家介绍一下都有哪些广告主题和形式。 广州朗圣药业有限公司成立于2003年,是专注于生殖健康用药、慢性病用药、外用药领域的研发、生产、营销于一体的高科技制药企业。秉持“让人类生殖…

YOLOv9改进 添加可变形注意力机制DAttention

一、Deformable Attention Transformer论文 论文地址:arxiv.org/pdf/2201.00520.pdf 二、Deformable Attention Transformer注意力结构 Deformable Attention Transformer包含可变形注意力机制,允许模型根据输入的内容动态调整注意力权重。在传统的Transformer中,注意力是…

如何挑选并高效学习你的“编程利器”

在数字化时代,编程语言成为了连接人与计算机的重要桥梁。然而,面对琳琅满目的编程语言,如何选择并高效学习,成为了许多初学者和开发者面临的挑战。今天,我们就来聊聊如何选择编程语言,以及如何高效地学习它…

15届蓝桥杯第二期模拟赛题单详细解析

文章目录 🧡🧡t1_求余🧡🧡思路代码 🧡🧡t2_灌水🧡🧡思路代码 🧡🧡t3_字符显示🧡🧡思路代码 🧡🧡t4_区间最大和…

jenkins使用公共库问题

Jenkins解决上编译解决引用问题 本地运行 把公共库创建链接到指定项目目录下即可 mklink /d /j D:\codepath\xxxx\yyyyy\tool_base D:\codepath\tool_base

分布式与集群,二者区别是什么?

🐓分布式 分布式系统是由多个独立的计算机节点组成的系统,这些节点通过网络协作完成任务。每个节点都有自己的独立计算能力和存储能力,可以独立运行。分布式系统的目标是提高系统的可靠性、可扩展性和性能。 分布式服务包含的技术和理论 负…

deepin23beta中SQLite3数据库安装与使用

SQLite 是一个嵌入式 SQL 数据库引擎,它实现了一个自包含、无服务器、零配置、事务性 SQL 数据库引擎。 SQLite 的代码属于公共领域,因此可以免费用于任何商业或私人目的。 SQLite 是世界上部署最广泛的数据库,其应用程序数量之多&#xff0c…

Midjourney视觉垫图

https://github.com/lllyasviel/Fooocus/discussions/117https://github.com/lllyasviel/Fooocus/discussions/117掌握Midjourney的垫图技巧:AI绘画中的参考利器本期将深入了解AI绘画的垫图技巧,让作品获得更好的出图效果https://mp.weixin.qq.com/s/RS2…