0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

王程 来源:jf_75796907 作者:jf_75796907 2024-02-02 10:42 次阅读

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。

wKgZomW7jsKAfaq_AAFcfr-bD2E344.pngwKgaomW7joCAdQk-AAFcfr-bD2E259.png

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 方法来处理调用传递过来的信息,并返回相应的结果。

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

wKgaomW7jsKARoYJAAEqdTboeZk392.pngwKgZomW7jpaAcE63AAEqdTboeZk756.png

注意事项与最佳实践

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

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

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

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

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

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

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

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

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

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

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 交互
    +关注

    关注

    1

    文章

    66

    浏览量

    14750
  • 鸿蒙
    +关注

    关注

    55

    文章

    1637

    浏览量

    42123
收藏 人收藏

    评论

    相关推荐

    深入理解HarmonyOS UIAbility:生命周期、WindowStage与启动模式探析

    UIAbility组件概述 UIAbility组件是HarmonyOS中一种包含UI界面的应用组件,主要用于与用户进行交互。每个UIAbility组件实例对应最近任务列表中的一个任务,
    的头像 发表于 02-17 15:33 396次阅读
    深入理解HarmonyOS <b class='flag-5'>UIAbility</b>:生命周期、WindowStage与启动模式探析

    鸿蒙开发-应用程序框架UIAbility的使用

    UIAbility概述 UIAbility是一种包含用户界面的应用组件,主要用于和用户进行交互UIAbility也是系统调度的单元,为应用提供窗口在其中绘制界面。 每一个
    发表于 01-17 16:36

    开发板烧录鸿蒙系统,有哪些方式

    请问开发板烧录鸿蒙系统,都有哪些方式啊?
    发表于 09-28 09:31

    华为鸿蒙认证测试题,你能答对几道?

    大家好,我是老王~今天就来做几道鸿蒙OS测试题,看看有多少人拿到满分?(20道题,1题5分,答案展示在文末)答案▼ABBACCABBBABBAABAAABCDAAABD——————原创:老王【个人微信:spoto777;公众号:鸿蒙
    发表于 11-17 16:03

    HDC2021技术分论坛:还有人不知道鸿蒙智联设备认证咋搞?

    设计开发中最大限度地节约设计力量的有效方式鸿蒙智联设备认证为此提供了灵活的继承认证策略供伙伴选择。举个例子来说,当伙伴有一款产品通过了认证后,伙伴可以选择做继承认证,只对产品变更点所
    发表于 11-22 18:21

    HDC2021技术分论坛:还有人不知道鸿蒙智联设备认证咋搞?

    连接体验,消费者还可以通过碰一碰拉起设备的万能卡片的交互方式管理设备。4. 硬件互助:具备硬件互助特征的鸿蒙智联生态
    发表于 11-23 17:15

    【视频】开发工具第11期:鸿蒙智联新交互体验实践分享(一)

    本课程首先以空气净化器为例,介绍了鸿蒙智联新交互的使用体验。然后以碰一碰为基础介绍了针对NFC碰一碰如何进行开发调测,为开发者提供一整套方案,包括
    发表于 01-29 11:37

    鸿蒙应用开发入门资料合集

    1、鸿蒙应用开发入门资料一:鸿蒙系统的概述1.1 鸿蒙系统是一个什么样的系统,亮点在哪里 官网首页上一句话告诉了我们鸿蒙系统是一个什么样的系
    发表于 03-22 11:23

    鸿蒙开源全场景应用开发资料汇总

    1、鸿蒙开源全场景应用开发——视频编解码面对鸿蒙这一全新的生态,广大消费者在积极尝鲜的同时,家中不可避免会出现安卓设备鸿蒙
    发表于 03-23 10:09

    HarmonyOS Connect鸿蒙智联水杯交互设计智慧生活APP线上开发注意事项与主要步骤

    注意:产品定义时,只选择智慧生活APP。注意:选择线上开发,就不需要线下开发的相关内容了。 理论上来讲,只是最简单的交互设计方式,就是智慧生活APP线上链接的
    发表于 07-20 14:33

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

    开发方式UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互。例如,图库类应用可以在UIAbility组件中展示图片瀑布流,在用户选择某个图片后,在新的页面中展
    发表于 05-25 17:44

    ArkTS语言HarmonyOS/OpenHarmony应用开发-router事件跳转到指定UIAbility

    开发过程 在卡片中使用postCardAction接口的router能力,能够快速拉起卡片提供方应用的指定UIAbility,因此UIAbility较多的应用往往会通过卡片提供不同的跳转按钮,实现
    发表于 06-13 17:22

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

    一、UIAbility组件概述1.概述 UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口;
    发表于 06-28 10:32

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

    一、UIAbility组件概述1.概述 UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口;
    发表于 06-28 10:32

    鸿蒙开发者使用的多卡菜单安装方式

    该三方开源库从github fork过来,主要将底层接口调用的实现修改成鸿蒙接口的实现,将三方库鸿蒙化,供开发鸿蒙应用的开发者使用。 项目移
    发表于 03-25 11:17 1次下载