鸿蒙开拓丨设备内UIAbility的几种交互办法_逻辑_华为
let wantInfo = { deviceId: '', // deviceId为空表示本设备 bundleName: 'com.example.myapplication', abilityName: 'FuncAbility', moduleName: 'module1', // moduleName非必选 parameters: { // 自定义信息 info: '来自EntryAbility Index页面', },};// context为调用方UIAbility的AbilityContextthis.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的AbilityContextthis.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的AbilityContextthis.context.terminateSelfWithResult(abilityResult, (err) => { // 处理停滞自身后的逻辑});
在调用方的回调中可以获取返回的结果:
const RESULT_CODE: number = 1001;// ...// context为调用方UIAbility的AbilityContextthis.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的AbilityContextthis.context.startAbility(wantInfo).then(() => { // 处理启动成功后的逻辑}).catch((err) => { // 处理启动失落败后的逻辑});
启动其他运用的UIAbility并获取返回结果
如果须要获取其他运用UIAbility的返回结果,可以利用startAbilityForResult方法:
let wantInfo = { deviceId: '', // deviceId为空表示本设备 action: 'ohos.want.action.editData', entities: ['entity.system.default'],};// context为调用方UIAbility的AbilityContextthis.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的AbilityContextthis.context.terminateSelfWithResult(abilityResult, (err) => { // 处理停滞自身后的逻辑});
在调用方的回调中可以获取返回的结果:
const RESULT_CODE: number = 1001;// ...// context为调用方UIAbility的AbilityContextthis.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的AbilityContextthis.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之间的交互时,开拓者该当把稳一些主要的事变和最佳实践,以确保运用程序的性能、稳定性和用户体验。
权限和安全性: 确保对敏感信息和操作进行适当的权限检讨,以保障用户隐私和运用的安全性。合理利用能力分级和权限管理机制。缺点处理: 对付UIAbility之间的交互,及时而有效的缺点处理是至关主要的。在利用catch捕获缺点时,可以供应友好的用户提示或记录详细的日志以便追踪和调试。业务场景设计: 在设计UIAbility之间的交互时,充分考虑业务场景和用户行为。确保交互逻辑符合用户的预期,提高用户体验。数据通报: 良好的数据通报机制是UIAbility之间交互的核心。在通报数据时,要确保数据的准确性、完全性,并进行必要的验证。生命周期管理: 把稳UIAbility的生命周期管理,合理利用startAbilityForResult和terminateSelfWithResult等方法,确保UIAbility的启动和停滞顺序合理。异步编程: 由于UIAbility之间的交互常日是异步的,确保在得当的机遇处理异步回调,避免壅塞用户界面。性能优化: 对付频繁启动和停滞UIAbility的情形,考虑性能优化,减少资源花费,提高运用相应速率。代码规范: 遵照良好的代码规范和开拓规范,使代码易读、易掩护,并且能够适应未来的扩展和更新。在实际运用中,以上这些建议可以根据详细的业务需求进行调度和扩展。通过合理的UIAbility之间的交互,开拓者可以实现更加丰富和繁芜的运用功能,为用户供应更好的利用体验。
关注#华为云开拓者同盟#点击下方,第一韶光理解华为云新鲜技能~
华为云博客_大数据博客_AI博客_云打算博客_开拓者中央-华为云
本文系作者个人观点,不代表本站立场,转载请注明出处!