首页 > 其他分享 >鸿蒙开发丨设备内UIAbility的几种交互方式

鸿蒙开发丨设备内UIAbility的几种交互方式

时间:2023-12-06 10:35:38浏览次数:44  
标签:交互方式 调用 鸿蒙 启动 UIAbility let context 交互

本文分享自华为云社区《设备内UIAbility交互:无缝体验与高级技巧》,作者: 柠檬味拥抱。

UIAbility组件间交互(设备内)

在设备内,UIAbility(用户界面能力)是系统调度的最小单元,它们负责展示用户界面和执行相关的业务逻辑。设备内的不同功能模块之间的交互是应用程序开发中的重要部分。本文将探讨设备内UIAbility之间的交互方式,包括启动应用内的UIAbility、启动其他应用的UIAbility以及通过Call调用实现UIAbility交互。

启动应用内的UIAbility

在一个应用内部存在多个UIAbility时,可能需要从一个UIAbility启动另一个UIAbility。例如,在支付应用中,从主界面UIAbility启动收款UIAbility。下面是一个示例代码,演示了如何在EntryAbility中启动FuncAbility:

let wantInfo = {
    deviceId: '', // deviceId为空表示本设备
    bundleName: 'com.example.myapplication',
    abilityName: 'FuncAbility',
    moduleName: 'module1', // moduleName非必选
    parameters: { // 自定义信息
        info: '来自EntryAbility Index页面',
    },
};

// context为调用方UIAbility的AbilityContext
this.context.startAbility(wantInfo).then(() => {
    // 处理启动成功后的逻辑
}).catch((err) => {
    // 处理启动失败后的逻辑
});

在FuncAbility中,可以通过生命周期回调方法onCreate接收来自EntryAbility传递的参数:

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

export default class FuncAbility extends UIAbility {
    onCreate(want, launchParam) {
        // 接收调用方UIAbility传过来的参数
        let funcAbilityWant = want;
        let info = funcAbilityWant?.parameters?.info;
        // ...
    }
}

启动应用内的UIAbility并获取返回结果

有时候,我们希望从一个UIAbility启动另一个UIAbility,并在后者完成业务后获取返回结果。例如,在登录UIAbility完成登录操作后,将登录结果返回给主界面UIAbility。下面是一个示例代码:

let wantInfo = {
    deviceId: '', // deviceId为空表示本设备
    bundleName: 'com.example.myapplication',
    abilityName: 'FuncAbility',
    moduleName: 'module1', // moduleName非必选
    parameters: { // 自定义信息
        info: '来自EntryAbility Index页面',
    },
};

// context为调用方UIAbility的AbilityContext
this.context.startAbilityForResult(wantInfo).then((data) => {
    // 处理从FuncAbility返回的结果
}).catch((err) => {
    // 处理启动失败后的逻辑
});

在FuncAbility中,完成业务后需要调用terminateSelfWithResult方法返回结果:

const RESULT_CODE: number = 1001;
let abilityResult = {
    resultCode: RESULT_CODE,
    want: {
        bundleName: 'com.example.myapplication',
        abilityName: 'FuncAbility',
        moduleName: 'module1',
        parameters: {
            info: '来自FuncAbility Index页面',
        },
    },
};

// context为被调用方UIAbility的AbilityContext
this.context.terminateSelfWithResult(abilityResult, (err) => {
    // 处理停止自身后的逻辑
});

在调用方的回调中可以获取返回的结果:

const RESULT_CODE: number = 1001;

// ...

// context为调用方UIAbility的AbilityContext
this.context.startAbilityForResult(want).then((data) => {
    if (data?.resultCode === RESULT_CODE) {
        // 解析被调用方UIAbility返回的信息
        let info = data.want?.parameters?.info;
        // 处理返回的结果
    }
}).catch((err) => {
    // 处理启动失败后的逻辑
});

启动其他应用的UIAbility

有时候,我们需要启动其他应用的UIAbility。这可以通过隐式Want启动实现,系统会根据调用方提供的条件匹配适当的UIAbility。

let wantInfo = {
    deviceId: '', // deviceId为空表示本设备
    action: 'ohos.want.action.viewData',
    entities: ['entity.system.default'],
};

// context为调用方UIAbility的AbilityContext
this.context.startAbility(wantInfo).then(() => {
    // 处理启动成功后的逻辑
}).catch((err) => {
    // 处理启动失败后的逻辑
});

启动其他应用的UIAbility并获取返回结果

如果需要获取其他应用UIAbility的返回结果,可以使用startAbilityForResult方法:

let wantInfo = {
    deviceId: '', // deviceId为空表示本设备
    action: 'ohos.want.action.editData',
    entities: ['entity.system.default'],
};

// context为调用方UIAbility的AbilityContext
this.context.startAbilityForResult(wantInfo).then((data) => {
    // 处理从其他应用UIAbility返回的结果
}).catch((err) => {
    // 处理启动失败后的逻辑
});

在被调用方的UIAbility中,需要调用terminateSelfWithResult方法返回结果:

const RESULT_CODE: number = 1001;
let abilityResult = {
    resultCode: RESULT_CODE,
    want: {
        bundleName: 'com.example.myapplication',
        abilityName: 'EntryAbility',
        moduleName: 'entry',
        parameters: {
            payResult: 'OKay',
        },
    },
};

// context为被调用方UIAbility的AbilityContext
this.context.terminateSelfWithResult(abilityResult, (err) => {
    // 处理停止自身后的逻辑
});

在调用方的回调中可以获取返回的结果:

const RESULT_CODE: number = 1001;

// ...

// context为调用方UIAbility的AbilityContext
this.context.startAbilityForResult(want).then((data) => {
    if (data?.resultCode === RESULT_CODE) {
        // 解析被调用方UIAbility返回的信息
        let payResult = data.want?.parameters?.payResult;
        // 处理返回的结果
    }
}).catch((err) => {
    // 处理启动失败后的逻辑
});

这些示例展示了在设备

内进行UIAbility之间交互的常见场景和方法,希望对您的应用程序开发有所帮助。

通过Call调用实现UIAbility交互(仅对系统应用开放)

在某些情况下,需要通过Call调用来实现UIAbility之间的交互。这种方式通常仅对系统应用开放。以下是一个简单的示例,演示了如何通过Call调用实现UIAbility的交互:

let wantInfo = {
    deviceId: '', // deviceId为空表示本设备
    abilityName: 'SystemAbility',
    parameters: {
        operation: 'performTask',
        task: 'someTask',
    },
};

// context为调用方UIAbility的AbilityContext
this.context.call(wantInfo).then((data) => {
    // 处理Call调用返回的结果
}).catch((err) => {
    // 处理Call调用失败后的逻辑
});

在被调用方的UIAbility中,需要实现onCall方法来处理Call调用:

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

export default class SystemAbility extends UIAbility {
    onCall(message) {
        // 处理Call调用传递过来的信息
        let operation = message?.operation;
        let task = message?.task;
        // ...
        
        // 返回Call调用的结果
        return {
            result: 'Task performed successfully',
        };
    }
}

这里使用了onCall方法来处理调用传递过来的信息,并返回相应的结果。

总体而言,通过startAbilitystartAbilityForResultcall等方法,UIAbility之间可以实现灵活的交互,满足各种应用场景的需求。在实际开发中,需要根据具体业务需求选择合适的方式进行UIAbility之间的通信,并确保良好的用户体验和应用的稳定性。

注意事项与最佳实践

在进行UIAbility之间的交互时,开发者应该注意一些重要的事项和最佳实践,以确保应用程序的性能、稳定性和用户体验。

  1. 权限和安全性: 确保对敏感信息和操作进行适当的权限检查,以保障用户隐私和应用的安全性。合理使用能力分级和权限管理机制。

  2. 错误处理: 对于UIAbility之间的交互,及时而有效的错误处理是至关重要的。在使用catch捕获错误时,可以提供友好的用户提示或记录详细的日志以便追踪和调试。

  3. 业务场景设计: 在设计UIAbility之间的交互时,充分考虑业务场景和用户行为。确保交互逻辑符合用户的预期,提高用户体验。

  4. 数据传递: 良好的数据传递机制是UIAbility之间交互的核心。在传递数据时,要确保数据的准确性、完整性,并进行必要的验证。

  5. 生命周期管理: 注意UIAbility的生命周期管理,合理使用startAbilityForResultterminateSelfWithResult等方法,确保UIAbility的启动和停止顺序合理。

  6. 异步编程: 由于UIAbility之间的交互通常是异步的,确保在合适的时机处理异步回调,避免阻塞用户界面。

  7. 性能优化: 对于频繁启动和停止UIAbility的情况,考虑性能优化,减少资源消耗,提高应用响应速度。

  8. 代码规范: 遵循良好的代码规范和开发规范,使代码易读、易维护,并且能够适应未来的扩展和更新。

在实际应用中,以上这些建议可以根据具体的业务需求进行调整和扩展。通过合理的UIAbility之间的交互,开发者可以实现更加丰富和复杂的应用功能,为用户提供更好的使用体验。

点击关注,第一时间了解华为云新鲜技术~

 

标签:交互方式,调用,鸿蒙,启动,UIAbility,let,context,交互
From: https://www.cnblogs.com/huaweiyun/p/17878962.html

相关文章

  • 『江鸟中原』鸿蒙---聊天应用(JS)
    鸿蒙大作业,一个简单的基于JS的聊天应用环境搭建软件要求DevEcoStudio版本:DevEcoStudio3.1Release。HarmonyOSSDK版本:APIversion9。硬件要求设备类型:华为手机或运行在DevEcoStudio上的华为手机设备模拟器。HarmonyOS系统:3.1.0DeveloperRelease。环境搭建安装DevEcoStudio......
  • flutter帮我们做了什么?(鸿蒙是flutter吗)
    Flutter和鸿蒙(HarmonyOS)是两个不同的移动应用开发框架,它们有各自的特点和用途。Flutter:UI框架:Flutter是由Google开发的UI工具包,用于在移动、Web和桌面平台上构建美观、高性能的应用。跨平台:Flutter允许开发者使用相同的代码库构建iOS、Android、Web和桌面应用程序,实现......
  • 深入理解HarmonyOS UIAbility:生命周期、WindowStage与启动模式探析
    本文分享自华为云社区《深入理解HarmonyOSUIAbility:生命周期、WindowStage与启动模式探析》,作者:柠檬味拥抱。UIAbility组件概述UIAbility组件是HarmonyOS中一种包含UI界面的应用组件,主要用于与用户进行交互。每个UIAbility组件实例对应最近任务列表中的一个任务,可以包含多个页......
  • 鸿蒙应用开发笔记[2]-简单界面布局
    摘要在HarmonyOS4开发一个应用,在ArkTS的Stage开发范式下简单进行界面布局.平台信息DevEcoStudio4.0Release构建版本:4.0.0.600,builtonOctober17,2023HarmonyOS4CompileSDK“3.1.0(API9)”原理简介ArtTS的Stage开发框架[https://developer.harmonyos.com/c......
  • 马士兵鸿蒙原生开发工程师
    获取完整版--》请留言鸿蒙是华为推出的手机操作系统,之所以做这件事就是因为华为在世界通信领域具有扎实的技术功底,已经在某些领域抢了美国的风头,美国才倾全国之力去压制华为,并列出了针对华为的一系列措施,华为也确实感受到被卡了脖子。除此之外,随着物联网的呼声越来越大,各个电子产......
  • 前后端的交互方式
    前后端的交互方式一、前后端的实现方式前后端交互可以通过以下几种方式实现:RESTfulAPI:使用HTTP协议进行通信,前端通过发送HTTP请求(GET、POST、PUT等)到后端API接口,后端返回相应的数据给前端。WebSocket:WebSocket是一种在单个TCP连接上进行全双工通信的协议,前后端可以通过WebSoc......
  • 《三国杀》完成鸿蒙原生应用开发,更多游戏品类加入鸿蒙生态
    近日,作为鸿蒙生态游戏先锋合作伙伴之一,游卡网络宣布已完成《三国杀》系列游戏鸿蒙原生应用开发,成为鸿蒙生态首款TOP级桌游卡牌类标杆游戏。作为一个国民级IP,游卡《三国杀》系列游戏与华为游戏中心的深度合作已逾10年,在今年HDC上更荣获了“鸿蒙生态先锋游戏”等重要奖项。依托鸿蒙......
  • 鸿蒙系统不兼容安卓,会引发行业跟风潮吗?
    鸿蒙系统不兼容安卓,会引发行业跟风潮吗?近日,有网传消息——华为鸿蒙系统从明年起将不再兼容安卓,并且有一不知名的“业内人士”称内部确有计划。毫无疑问,大公司的任何一点风吹草动都会在业界引起关注与讨论。如果华为鸿蒙系统不再兼容安卓,将带来哪些影响?这一举动是否会引发行业跟风潮......
  • RK3568J“麒麟”+“翼辉”国产系统正式发布,“鸿蒙”也正在路上!
    RK3568J”麒麟“ + “翼辉”国产系统正式发布近期,创龙科技RK3568J全国产平台(国产化率100%,提供报告)已正式适配两大国产系统:银河麒麟嵌入式操作系统KylinOS(V10SP1)+ 翼辉嵌入式操作系统SylixOS(V2.3.12)!国产系统作为信创关键行业的关键基础软件,在工业领域发挥重大作用。创龙......
  • 鸿蒙原生应用/元服务开发-AGC分发如何申请发布证书
    申请发布证书发布证书由AGC颁发的、为HarmonyOS应用配置签名信息的数字证书,可保障软件代码完整性和发布者身份真实性。证书格式为.cer,包含公钥、证书指纹等信息。说明请确保您的开发者帐号已实名认证。每个帐号最多申请1个发布证书。1.登录AppGalleryConnect,选择“用户与访问”。2......