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

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

时间:2024-02-01 20:31:59浏览次数:31  
标签:交互方式 调用 鸿蒙 启动 UIAbility let context 交互

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。

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

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 之间的通信,并确保良好的用户体验和应用的稳定性。

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

注意事项与最佳实践

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

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

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

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

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

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

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

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

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

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

标签:交互方式,调用,鸿蒙,启动,UIAbility,let,context,交互
From: https://blog.51cto.com/u_16536309/9536205

相关文章

  • 鸿蒙开发游戏(一)---大鱼吃小鱼(界面部署)
    鸿蒙开发游戏(一)---大鱼吃小鱼(界面部署)鸿蒙开发游戏(二)---大鱼吃小鱼(摇杆控制)鸿蒙开发游戏(三)---大鱼吃小鱼(放置NPC)鸿蒙开发游戏(四)---大鱼吃小鱼(互吃升级)鸿蒙开发游戏(五)---大鱼吃小鱼(添加音效)鸿蒙开发游戏(六)---大鱼吃小鱼(称霸海洋) 前言:你是否玩过古老而不失优雅的大鱼吃小鱼......
  • 纯血鸿蒙来了,鸿蒙App开发有可能提速吗?
    “全世界做产品挣钱的公司很多,但有能力打造操作系统的公司没有几家,最后世界上的操作系统就只有三套:鸿蒙、iOS和安卓。”---360集团创始人、董事长周鸿祎 “HarmonyOS实现了AI框架、大模型、设计系统、编程框架、编程语言、编译器等全栈自研,有核心技术、全栈能力、底座和生......
  • 鸿蒙开发之发动画篇
    动画的原理是在一个时间段内,多次改变UI外观,由于人眼会产生视觉暂留,所以最终看到的就是一个“连续”的动画。UI的一次改变称为一个动画帧,对应一次屏幕刷新,而决定动画流畅度的一个重要指标就是帧率FPS(FramePerSecond),即每秒的动画帧数,帧率越高则动画就会越流畅。ArkUI中,产生动画的方......
  • 资深Android逆袭、华为鸿蒙为安卓程序员开辟了一条新道路
    本文章主要从以下5个方面来展开聊聊这个话题:1.什么是鸿蒙2.鸿蒙系统发展时间线3.鸿蒙是套壳Android吗?4.鸿蒙的生态(用户以及开发者)5.一些建议1月18日,在鸿蒙生态千帆启航仪式上,华为宣布了继鸿蒙4.0之后的鸿蒙操作系统,星河版的预览版本,引起了广泛的讨论,这是一款完全剥离安卓......
  • 鸿蒙页面示例
    @Component标签修饰UI,相当于Android的view,所有的UI组件都要使用@Component标签@Entry标签表明当前是一个页面,不是一个视图。多个组件组合时只能有一个@Entry标签,被该标签修饰后页面才会有生命周期importrouterfrom'@ohos.router'@Entry@ComponentstructLogin{@Statetit......
  • 鸿蒙知识点
    1、鸿蒙上的类似adb的工具名叫hdchdc(HarmonyOSDeviceConnector)是HarmonyOS为开发人员提供的用于调试的命令行工具,通过该工具可以在window/linux/mac系统上与真实设备或者模拟器进行交互。(1)hdclisttargets(2)hdcfilesendlocalremote(3)hdcinstallpackageFile这里列举的几个命......
  • 鸿蒙小知识点
    1、鸿蒙上的类似adb的工具名叫hdchdc(HarmonyOSDeviceConnector)是HarmonyOS为开发人员提供的用于调试的命令行工具,通过该工具可以在window/linux/mac系统上与真实设备或者模拟器进行交互。(1)hdclisttargets(2)hdcfilesendlocalremote(3)hdcinstallpackageFile这里列举的几个命......
  • 对于企业来讲鸿蒙是机会还是累赘?
    企业的IT部门,工程师永远在疲于奔命的学习新的技术技能。一轮技术革命来了,还没消化透、玩明白,下一波又来了。搞IT的人,总在说,业务功能要的太急、需求变化来的太快,应接不暇。业务部门永远是难以伺候、不能满意。这对矛盾的来源在于,技术生态的多样性多元化,和技术门槛的高居不下,无法平衡......
  • 鸿蒙二进制数组创建
    背景c++层数据都是二进制,需要转换成arrayBuffer透传到ets层给业务使用,但是鸿蒙的使用下面两个api创建出来的二进制数组数据都是错误的。接口napi_create_arraybuffer:这个接口只能创建空的二进制数组,没办法把char的内容丢进去创建napi_create_external_arraybuffer:这个接口支持......
  • 鸿蒙OS和开源鸿蒙什么关系?
    开源鸿蒙(OpenHarmony)鸿蒙系统愿来的设计初衷,就是让所有设备都可以运行一个系统,但是每个设备的运算能力和功能都不同,所以内核的设计上,采用了微内核的设计,除了最基础的功能放在内核,其他功能都以模块的形式存在。华为用的是鸿蒙OS我们都知道,华为手机的鸿蒙OS是可以运行安卓软件的,是因......