鸿蒙实战:使用显式Want启动Ability

news2024/11/24 2:26:44

文章目录

  • 1. 实战概述
  • 2. 实现步骤
    • 2.1 创建鸿蒙应用项目
    • 2.2 修改Index.ets代码
    • 2.3 创建SecondAbility
    • 2.4 创建Second.ets
  • 3. 测试效果
  • 4. 实战总结
  • 5. 拓展练习 - 启动文件管理器
    • 5.1 创建鸿蒙应用项目
    • 5.2 修改Index.ets代码
    • 5.3 测试应用运行效果

1. 实战概述

  • 本实战详细阐述了在 HarmonyOS 上开发应用的过程,包括创建项目、修改页面代码、创建 Ability 以及页面间的数据传递。首先,通过 DevEco Studio 创建名为 WantStartAbility 的鸿蒙项目。接着,对 Index.ets 页面进行编码,实现点击按钮后通过 Want 对象显式启动 SecondAbility 并传递参数。然后,创建 SecondAbility 类,在其 onCreate 方法中接收参数并存储在全局变量中。最后,通过 Second.ets 页面组件展示从 SecondAbility 获取的数据。整个流程涵盖了从项目初始化到具体编码实践的完整开发周期。

2. 实现步骤

2.1 创建鸿蒙应用项目

  • 创建鸿蒙应用项目 - WantStartAbility
    在这里插入图片描述

  • 单击【Finish】按钮,生成应用基本框架
    在这里插入图片描述

2.2 修改Index.ets代码

  • 首页 - pages/Index.ets
    在这里插入图片描述
import { common, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';

const TAG: string = '[Page_Index]';
const DOMAIN_NUMBER: number = 0xFF00;

@Entry
@Component
struct Index {
  @State message: string = 'Index页面';
  private context = getContext(this) as common.UIAbilityContext;

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(40)
          .fontWeight(FontWeight.Bold)
          .foregroundColor(Color.Yellow)
          .margin('10')
        // 添加按钮
        Button('跳转')
          .fontSize(40)
          .width(150)
          .height(70)
          .backgroundColor('#44dd22')
          .foregroundColor('#ffffff')
          .onClick(() => {
            // 创建显式 Want 对象
            let wantInfo: Want = {
              deviceId: '', // deviceId 为空表示本设备
              bundleName: 'net.huawei.wsa', // 目标应用的包名
              abilityName: 'SecondAbility', // 目标 Ability 的名称
              parameters: {
                id: '20240101',
                name: '陈燕文',
                gender: '女',
                age: 19,
                major: '软件技术专业',
                class: '2024软件1班',
                telephone: '15893451170'
              },
            };

            // context为调用方UIAbility的UIAbilityContext
            this.context.startAbility(wantInfo).then(() => {
              hilog.info(DOMAIN_NUMBER, TAG, 'startAbility success.');
            }).catch((error: BusinessError) => {
              hilog.error(DOMAIN_NUMBER, TAG, 'startAbility failed.');
            });
          });
      }
      .width('100%');
    }
    .height('100%')
    .backgroundColor('#00662F')
  }
}
  • 代码说明:这段代码定义了一个名为 Second 的页面组件,使用 HarmonyOS 的 ArkUI 框架。页面包含一个文本显示和一个按钮,点击按钮后,通过 Want 对象显式启动名为 SecondAbility 的 Ability,并传递一系列参数。页面背景为深绿色(#00662F),文本为黄色加粗。启动 Ability 后,通过日志记录操作结果。

2.3 创建SecondAbility

  • src/main/ets里创建SecondAbility
    在这里插入图片描述
  • 单击【Finish】按钮
    在这里插入图片描述
  • 创建完成之后,会自动在module.json5文件中注册该Ability
    在这里插入图片描述
  • 修改代码,将pages/Index改成pages/Second,接收传递来的参数,并写入全局变量
    在这里插入图片描述
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';

// 定义Student接口
interface Student {
  id: string,
  name: string,
  gender: string,
  age: number,
  major: string,
  class: string,
  telephone: string
}

export default class SecondAbility extends UIAbility {
  // 定义Student对象
  static student: Student = {id: '', name: '', gender: '', age: 0, major: '', class: '', telephone: ''};

  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
    // 接收调用方UIAbility传过来的参数
    let secondAbilityWant = want;
    SecondAbility.student.id = secondAbilityWant?.parameters?.id as string;
    SecondAbility.student.name = secondAbilityWant?.parameters?.name as string;
    SecondAbility.student.gender = secondAbilityWant?.parameters?.gender as string;
    SecondAbility.student.age = secondAbilityWant?.parameters?.age as number;
    SecondAbility.student.major = secondAbilityWant?.parameters?.major as string;
    SecondAbility.student.class = secondAbilityWant?.parameters?.class as string;
    SecondAbility.student.telephone = secondAbilityWant?.parameters?.telephone as string;
  }

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

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

    windowStage.loadContent('pages/Second', (err) => {
      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.');
    });
  }

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

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

  onBackground(): void {
    // Ability has back to background
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }
}
  • 代码说明:这段代码定义了 SecondAbility 类,继承自 UIAbility,用于管理应用的窗口和生命周期。在 onCreate 方法中,它接收启动参数并存储在静态 student 对象中。代码还包含了日志记录和页面加载逻辑,确保在窗口阶段创建时加载 pages/Second 页面。此外,定义了一个 Student 接口来描述接收的学生信息结构。

2.4 创建Second.ets

  • pages里创建Second.ets文件
    在这里插入图片描述
import SecondAbility from '../secondability/SecondAbility';

@Entry
@Component
struct Second {
  @State message: string = 'Second页面';
  @State student: string = '';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(40)
          .fontWeight(FontWeight.Bold)
          .foregroundColor(Color.Yellow)
          .margin('10')
        Text(this.student)
          .fontSize(30)
          .fontWeight(FontWeight.Bold)
          .foregroundColor(Color.Green)
          .margin('10')
        Button('接收')
          .fontSize(40)
          .width(150)
          .height(70)
          .backgroundColor('#44dd22')
          .foregroundColor('#ffffff')
          .onClick(() => {
            // 获取来自SecondAbility的数据
            let student: string = '学号:' + SecondAbility.student.id + '\n'
              + '姓名:' + SecondAbility.student.name + '\n'
              + '性别:' + SecondAbility.student.gender + '\n'
              + '年龄:' + SecondAbility.student.age + '\n'
              + '专业:' + SecondAbility.student.major + '\n'
              + '班级:' + SecondAbility.student.class + '\n'
              + '手机:' + SecondAbility.student.telephone;
            // 修改文本组件的内容
            this.student = student;
          })
      }
      .width('100%')
    }
    .height('100%')
    .backgroundColor('#00008B')
  }
}
  • 代码说明:这段代码创建了一个 Second 页面组件,其中包含两个文本区域和一个按钮。初始状态下,显示默认文本“Second页面”。点击“接收”按钮后,从 SecondAbility 中获取学生信息,并更新 student 状态以在页面上显示这些详细信息。页面背景为深蓝色(#00008B),默认文本为黄色加粗,学生信息文本为绿色加粗。此代码实现了 Ability 层与 UI 层间的数据交互和展示。

3. 测试效果

  • 启动应用,显示首页
    在这里插入图片描述
  • 单击【跳转】按钮,显示第二个页面
    在这里插入图片描述
  • 单击【接收】按钮,显示接收的数据
    在这里插入图片描述

4. 实战总结

  • 通过本实战,我们掌握了在HarmonyOS中创建应用、实现页面跳转和数据传递的完整流程。首先,我们学习了如何使用DevEco Studio搭建项目框架。接着,通过编码实践,我们实现了从Index页面到SecondAbility的显式跳转,并传递了参数。在SecondAbility中,我们接收并处理了这些参数,随后在Second页面中展示了这些数据。此过程不仅加深了对HarmonyOS应用开发的理解,也提升了我们的实际开发技能。

5. 拓展练习 - 启动文件管理器

5.1 创建鸿蒙应用项目

  • 创建鸿蒙应用项目 - StartFileManager
    在这里插入图片描述

  • 单击【Finish】按钮,生成应用基本框架
    在这里插入图片描述

5.2 修改Index.ets代码

  • 首页 - pages/Index.ets
    在这里插入图片描述
import { Want, common } from '@kit.AbilityKit';

function startFileManagement(context: common.UIAbilityContext): void {
  let want: Want = {
    bundleName: 'com.huawei.hmos.filemanager',
    abilityName: 'MainAbility'
  };
  context.startAbility(want);
}

@Entry
@Component
struct Index {
  @State message: string = 'Index页面';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(40)
          .fontWeight(FontWeight.Bold)
          .foregroundColor(Color.Yellow)
          .margin('10')
        // 添加按钮
        Button('文件管理器')
          .fontSize(30)
          .width(250)
          .height(70)
          .backgroundColor('#44dd22')
          .foregroundColor('#ffffff')
          .onClick(() => {
            const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
            startFileManagement(context);
          });
      }
      .width('100%');
    }
    .height('100%')
    .backgroundColor('#00662F')
  }
}
  • 代码说明:这段代码基于鸿蒙开发框架编写。定义了startFileManagement函数用于构造Want对象并启动文件管理器应用。Index组件构建了页面布局,含显示文本与按钮,点击按钮时获取上下文来调用启动函数,旨在实现点击按钮启动文件管理器的交互操作。

5.3 测试应用运行效果

  • 启动应用,显示首页
    在这里插入图片描述
  • 单击【文件管理器】按钮
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Python浪漫的烟花表白特效》

一、背景介绍 烟花象征着浪漫与激情,将它与表白结合在一起,会创造出别具一格的惊喜效果。使用Python的turtle模块,我们可以轻松绘制出动态的烟花特效,再配合文字表白,打造一段专属的浪漫体验。 接下来,让…

springboot中设计基于Redisson的分布式锁注解

如何使用AOP设计一个分布式锁注解&#xff1f; 1、在pom.xml中配置依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.3.26</version></dependency><dependenc…

绕过CDN寻找真实IP

在新型涉网案件中&#xff0c;我们在搜集到目标主站之后常常需要获取对方网站的真实IP去进一步的信息搜集&#xff0c;但是现在网站大多都部署了CDN&#xff0c;将资源部署分发到边缘服务器&#xff0c;实现均衡负载&#xff0c;降低网络堵塞&#xff0c;让用户能够更快地访问自…

【Redis】redis缓存击穿,缓存雪崩,缓存穿透

一、什么是缓存&#xff1f; 缓存就是与数据交互中的缓冲区&#xff0c;它一般存储在内存中且读写效率高&#xff0c;提高响应时间提高并发性能&#xff0c;如果访问数据的话可以先访问缓存&#xff0c;避免数据查询直接操作数据库&#xff0c;造成后端压力过大。 但是可能会面…

linux复习5:C prog

编辑 缩排 为了使C源代码更加整洁易读&#xff0c;可以使用一些工具来自动格式化代码&#xff0c;例如cb&#xff08;C程序美化器&#xff09;、bcpp&#xff08;C美化器&#xff09;和indent等。 编译 编译并链接C文件 gcc hello.c -o hello 将 hello.c 编译并链接成可执行文…

uni-app快速入门(十)--常用内置组件(下)

本文介绍uni-app的textarea多行文本框组件、web-view组件、image图片组件、switch开关组件、audio音频组件、video视频组件。 一、textarea多行文本框组件 textarea组件在HTML 中相信大家非常熟悉&#xff0c;组件的官方介绍见&#xff1a; textarea | uni-app官网uni-app,un…

世界坐标系、相机坐标系、图像物理坐标系、像素平面坐标系

坐标系及其转换在计算机视觉领域占据核心地位。理解如何从一个坐标系转换到另一个坐标系&#xff0c;不仅是理论上的需要&#xff0c;也是实际应用中不可或缺的技能。 一、世界坐标系的定义 世界坐标系是一个全局的坐标系统&#xff0c;用于定义场景中物体的位置。在这个坐标…

机器学习笔记——聚类算法(Kmeans、GMM-使用EM优化)

本笔记介绍机器学习中常见的聚类算法&#xff08;Kmeans、GMM-使用EM优化&#xff09;。 文章目录 聚类K-Means工作原理特点 K-Medoids工作原理特点 Mini-Batch K-Means工作原理特点 K-Means&#xff08;重要&#xff09;工作原理特点 总结K的选值1. 肘部法则&#xff08;Elbow…

浅议Flink中的通讯工具: Akka

在Flink中&#xff0c;各个组件之间需要频繁交换数据和控制信息。Flink选择了基于Actor模型的Akka框架作为通信基础。 Akka是什么 Actor模型 Actor模型是用于单个进程中并发的场景。 在Actor模型中&#xff1a; ActorSystem负责管理actor生命周期 将每个实体视为独立的 Ac…

如何在react中使用react-monaco-editor渲染出一个编辑器

一、效果展示 二、基于vite配置 1.首先安装react-monaco-editor和monaco-editor包 npm add react-monaco-editor npm i monaco-editor 2.其次创建一个单独的文件&#xff08;此处是tsx、直接用app或者jsx也行&#xff09; import { useState, useEffect } from react impo…

孙玲:从流水线工人到谷歌程序员

这是《开发者说》的第24期&#xff0c;本期我们邀请的开发者是孙玲&#xff0c;她出生于湖南娄底一个贫穷的农村家庭&#xff0c;2009年高考落榜&#xff0c;她去了深圳一家电子厂&#xff0c;在流水线上给电池喷码&#xff0c;每天12个小时轮班&#xff0c;月薪2300&#xff0…

kali搭建pikachu靶场

前言&#xff1a; 总所周知搭个网站需要有apachemysqlphp&#xff0c;Apache是一个开源的Web服务器软件&#xff0c; MySQL是一种关系型数据库管理系统&#xff08;数据库&#xff09;&#xff0c;PHP是一种在服务器上执行的脚本语言 文章内容来自&#xff1a;【黑帽编程与攻…

android 使用MediaPlayer实现音乐播放--获取音乐数据

前面已经添加了权限&#xff0c;有权限后可以去数据库读取音乐文件&#xff0c;一般可以获取全部音乐、专辑、歌手、流派等。 1. 获取全部音乐数据 class MusicHelper {companion object {SuppressLint("Range")fun getMusic(context: Context): MutableList<Mu…

VMware Workstation 17.6.1

概述 目前 VMware Workstation Pro 发布了最新版 v17.6.1&#xff1a; 本月11号官宣&#xff1a;针对所有人免费提供&#xff0c;包括商业、教育和个人用户。 使用说明 软件安装 获取安装包后&#xff0c;双击默认安装即可&#xff1a; 一路单击下一步按钮&#xff1a; 等待…

Methode Electronics EDI 需求分析

Methode Electronics 是一家总部位于美国的全球性技术公司&#xff0c;专注于设计和制造用于多个行业的电子和电气组件&#xff0c;产品涵盖汽车、工业、电信、医疗设备以及消费电子等多个领域&#xff0c;提供创新的解决方案。 填写Methode_EDI_Parameters_Template Methode_…

uniapp自动注册机制:easycom

传统 Vue 项目中&#xff0c;我们需要注册、导入组件之后才能使用组件。 uniapp 框架提供了一种组件自动注册机制&#xff0c;只要你在 components 文件夹下新建的组件满足 /components/组件名/组件名.vue 的命名规范&#xff0c;就能直接使用。 注意&#xff1a;组件的文件夹…

【Vue】Vue3.0(二十六)Vue3.0中的作用域插槽

上篇文章 【Vue】Vue3.0&#xff08;二十五&#xff09;Vue3.0中的具名插槽 的概念和使用场景 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月20日17点30分 文章目录 概念使用场景示…

C语言第14节:字符函数和字符串函数

1. 字符分类函数 C语言中有一系列的函数是专门做字符分类的&#xff0c;也就是一个字符是属于什么类型的字符的。这些函数的使用都需要包含一个头文件是<ctype.h> <ctype.h>头文件中的字符分类函数提供了一组用于检查单个字符特性的函数。这些函数接收一个字符&a…

IDEA怎么定位java类所用maven依赖版本及引用位置

在实际开发中&#xff0c;我们可能会遇到需要搞清楚代码所用依赖版本号及引用位置的场景&#xff0c;便于排查问题&#xff0c;怎么通过IDEA实现呢&#xff1f; 可以在IDEA中打开项目&#xff0c;右键点击maven的pom.xml文件&#xff0c;或者在maven窗口下选中项目&#xff0c;…

使用vscode+expo+Android夜神模拟器运行react-native项目

1.进入夜神模拟器安装路径下的bin目录 2.输入命令&#xff0c;连接Android Studio 启动夜神模拟器后&#xff0c; 打开安装目录的bin文件夹执行下面的命令&#xff0c;只需执行一次&#xff09; nox_adb.exe connect 127.0.0.1:62001adb connect 127.0.0.1:62001 3.运行项目…