UIAbility 組件間交互(設(shè)備內(nèi))
在設(shè)備內(nèi),UIAbility(用戶界面能力)是系統(tǒng)調(diào)度的最小單元,它們負責(zé)展示用戶界面和執(zhí)行相關(guān)的業(yè)務(wù)邏輯。設(shè)備內(nèi)的不同功能模塊之間的交互是應(yīng)用程序開發(fā)中的重要部分。本文將探討設(shè)備內(nèi) UIAbility 之間的交互方式,包括啟動應(yīng)用內(nèi)的 UIAbility、啟動其他應(yīng)用的 UIAbility 以及通過 Call 調(diào)用實現(xiàn) UIAbility 交互。
啟動應(yīng)用內(nèi)的 UIAbility
在一個應(yīng)用內(nèi)部存在多個 UIAbility 時,可能需要從一個 UIAbility 啟動另一個 UIAbility。例如,在支付應(yīng)用中,從主界面 UIAbility 啟動收款 UIAbility。下面是一個示例代碼,演示了如何在 EntryAbility 中啟動 FuncAbility:
let wantInfo = { deviceId: '', // deviceId為空表示本設(shè)備 bundleName: 'com.example.myapplication', abilityName: 'FuncAbility', moduleName: 'module1', // moduleName非必選 parameters: { // 自定義信息 info: '來自EntryAbility Index頁面', }, }; // context為調(diào)用方UIAbility的AbilityContext this.context.startAbility(wantInfo).then(() => { // 處理啟動成功后的邏輯 }).catch((err) => { // 處理啟動失敗后的邏輯 });
在 FuncAbility 中,可以通過生命周期回調(diào)方法 onCreate 接收來自 EntryAbility 傳遞的參數(shù):
import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';
export default class FuncAbility extends UIAbility {
    onCreate(want, launchParam) {
        // 接收調(diào)用方UIAbility傳過來的參數(shù)
        let funcAbilityWant = want;
        let info = funcAbilityWant?.parameters?.info;
        // ...
    }
}
啟動應(yīng)用內(nèi)的 UIAbility 并獲取返回結(jié)果
有時候,我們希望從一個 UIAbility 啟動另一個 UIAbility,并在后者完成業(yè)務(wù)后獲取返回結(jié)果。例如,在登錄 UIAbility 完成登錄操作后,將登錄結(jié)果返回給主界面 UIAbility。下面是一個示例代碼:
let wantInfo = {
    deviceId: '', // deviceId為空表示本設(shè)備
    bundleName: 'com.example.myapplication',
    abilityName: 'FuncAbility',
    moduleName: 'module1', // moduleName非必選
    parameters: { // 自定義信息
        info: '來自EntryAbility Index頁面',
    },
};
// context為調(diào)用方UIAbility的AbilityContext
this.context.startAbilityForResult(wantInfo).then((data) => {
    // 處理從FuncAbility返回的結(jié)果
}).catch((err) => {
    // 處理啟動失敗后的邏輯
});
在 FuncAbility 中,完成業(yè)務(wù)后需要調(diào)用 terminateSelfWithResult 方法返回結(jié)果:
const RESULT_CODE: number = 1001;
let abilityResult = {
    resultCode: RESULT_CODE,
    want: {
        bundleName: 'com.example.myapplication',
        abilityName: 'FuncAbility',
        moduleName: 'module1',
        parameters: {
            info: '來自FuncAbility Index頁面',
        },
    },
};
// context為被調(diào)用方UIAbility的AbilityContext
this.context.terminateSelfWithResult(abilityResult, (err) => {
    // 處理停止自身后的邏輯
});
在調(diào)用方的回調(diào)中可以獲取返回的結(jié)果:
const RESULT_CODE: number = 1001;
// ...
// context為調(diào)用方UIAbility的AbilityContext
this.context.startAbilityForResult(want).then((data) => {
    if (data?.resultCode === RESULT_CODE) {
        // 解析被調(diào)用方UIAbility返回的信息
        let info = data.want?.parameters?.info;
        // 處理返回的結(jié)果
    }
}).catch((err) => {
    // 處理啟動失敗后的邏輯
});
啟動其他應(yīng)用的 UIAbility
有時候,我們需要啟動其他應(yīng)用的 UIAbility。這可以通過隱式 Want 啟動實現(xiàn),系統(tǒng)會根據(jù)調(diào)用方提供的條件匹配適當(dāng)?shù)?UIAbility。
	

let wantInfo = {
    deviceId: '', // deviceId為空表示本設(shè)備
    action: 'ohos.want.action.viewData',
    entities: ['entity.system.default'],
};
// context為調(diào)用方UIAbility的AbilityContext
this.context.startAbility(wantInfo).then(() => {
    // 處理啟動成功后的邏輯
}).catch((err) => {
    // 處理啟動失敗后的邏輯
});
啟動其他應(yīng)用的 UIAbility 并獲取返回結(jié)果
如果需要獲取其他應(yīng)用 UIAbility 的返回結(jié)果,可以使用 startAbilityForResult 方法:
let wantInfo = {
    deviceId: '', // deviceId為空表示本設(shè)備
    action: 'ohos.want.action.editData',
    entities: ['entity.system.default'],
};
// context為調(diào)用方UIAbility的AbilityContext
this.context.startAbilityForResult(wantInfo).then((data) => {
    // 處理從其他應(yīng)用UIAbility返回的結(jié)果
}).catch((err) => {
    // 處理啟動失敗后的邏輯
});
在被調(diào)用方的 UIAbility 中,需要調(diào)用 terminateSelfWithResult 方法返回結(jié)果:
const RESULT_CODE: number = 1001;
let abilityResult = {
    resultCode: RESULT_CODE,
    want: {
        bundleName: 'com.example.myapplication',
        abilityName: 'EntryAbility',
        moduleName: 'entry',
        parameters: {
            payResult: 'OKay',
        },
    },
};
// context為被調(diào)用方UIAbility的AbilityContext
this.context.terminateSelfWithResult(abilityResult, (err) => {
    // 處理停止自身后的邏輯
});
在調(diào)用方的回調(diào)中可以獲取返回的結(jié)果:
const RESULT_CODE: number = 1001;
// ...
// context為調(diào)用方UIAbility的AbilityContext
this.context.startAbilityForResult(want).then((data) => {
    if (data?.resultCode === RESULT_CODE) {
        // 解析被調(diào)用方UIAbility返回的信息
        let payResult = data.want?.parameters?.payResult;
        // 處理返回的結(jié)果
    }
}).catch((err) => {
    // 處理啟動失敗后的邏輯
});
這些示例展示了在設(shè)備
內(nèi)進行 UIAbility 之間交互的常見場景和方法,希望對您的應(yīng)用程序開發(fā)有所幫助。
通過 Call 調(diào)用實現(xiàn) UIAbility 交互(僅對系統(tǒng)應(yīng)用開放)
在某些情況下,需要通過 Call 調(diào)用來實現(xiàn) UIAbility 之間的交互。這種方式通常僅對系統(tǒng)應(yīng)用開放。以下是一個簡單的示例,演示了如何通過 Call 調(diào)用實現(xiàn) UIAbility 的交互:
let wantInfo = {
    deviceId: '', // deviceId為空表示本設(shè)備
    abilityName: 'SystemAbility',
    parameters: {
        operation: 'performTask',
        task: 'someTask',
    },
};
// context為調(diào)用方UIAbility的AbilityContext
this.context.call(wantInfo).then((data) => {
    // 處理Call調(diào)用返回的結(jié)果
}).catch((err) => {
    // 處理Call調(diào)用失敗后的邏輯
});
在被調(diào)用方的 UIAbility 中,需要實現(xiàn) onCall 方法來處理 Call 調(diào)用:
import UIAbility from '@ohos.app.ability.UIAbility';
export default class SystemAbility extends UIAbility {
    onCall(message) {
        // 處理Call調(diào)用傳遞過來的信息
        let operation = message?.operation;
        let task = message?.task;
        // ...
        
        // 返回Call調(diào)用的結(jié)果
        return {
            result: 'Task performed successfully',
        };
    }
}
這里使用了 onCall 方法來處理調(diào)用傳遞過來的信息,并返回相應(yīng)的結(jié)果。
總體而言,通過 startAbility、startAbilityForResult、call 等方法,UIAbility 之間可以實現(xiàn)靈活的交互,滿足各種應(yīng)用場景的需求。在實際開發(fā)中,需要根據(jù)具體業(yè)務(wù)需求選擇合適的方式進行 UIAbility 之間的通信,并確保良好的用戶體驗和應(yīng)用的穩(wěn)定性。
	

注意事項與最佳實踐
在進行 UIAbility 之間的交互時,開發(fā)者應(yīng)該注意一些重要的事項和最佳實踐,以確保應(yīng)用程序的性能、穩(wěn)定性和用戶體驗。
1.權(quán)限和安全性: 確保對敏感信息和操作進行適當(dāng)?shù)臋?quán)限檢查,以保障用戶隱私和應(yīng)用的安全性。合理使用能力分級和權(quán)限管理機制。
2.錯誤處理: 對于 UIAbility 之間的交互,及時而有效的錯誤處理是至關(guān)重要的。在使用 catch 捕獲錯誤時,可以提供友好的用戶提示或記錄詳細的日志以便追蹤和調(diào)試。
3.業(yè)務(wù)場景設(shè)計: 在設(shè)計 UIAbility 之間的交互時,充分考慮業(yè)務(wù)場景和用戶行為。確保交互邏輯符合用戶的預(yù)期,提高用戶體驗。
4.數(shù)據(jù)傳遞: 良好的數(shù)據(jù)傳遞機制是 UIAbility 之間交互的核心。在傳遞數(shù)據(jù)時,要確保數(shù)據(jù)的準(zhǔn)確性、完整性,并進行必要的驗證。
5.生命周期管理: 注意 UIAbility 的生命周期管理,合理使用 startAbilityForResult 和 terminateSelfWithResult 等方法,確保 UIAbility 的啟動和停止順序合理。
6.異步編程: 由于 UIAbility 之間的交互通常是異步的,確保在合適的時機處理異步回調(diào),避免阻塞用戶界面。
7.性能優(yōu)化: 對于頻繁啟動和停止 UIAbility 的情況,考慮性能優(yōu)化,減少資源消耗,提高應(yīng)用響應(yīng)速度。
8.代碼規(guī)范: 遵循良好的代碼規(guī)范和開發(fā)規(guī)范,使代碼易讀、易維護,并且能夠適應(yīng)未來的擴展和更新。
在實際應(yīng)用中,以上這些建議可以根據(jù)具體的業(yè)務(wù)需求進行調(diào)整和擴展。通過合理的 UIAbility 之間的交互,開發(fā)者可以實現(xiàn)更加豐富和復(fù)雜的應(yīng)用功能,為用戶提供更好的使用體驗。
審核編輯 黃宇
- 
                                交互
                                +關(guān)注
關(guān)注
1文章
72瀏覽量
15261 - 
                                鴻蒙
                                +關(guān)注
關(guān)注
60文章
2771瀏覽量
45192 
發(fā)布評論請先 登錄
HarmonyOS開發(fā)案例:【UIAbility內(nèi)和UIAbility間頁面的跳轉(zhuǎn)】
    
鴻蒙開發(fā)-應(yīng)用程序框架UIAbility的使用
UIAbility組件與UI的數(shù)據(jù)同步介紹
UIAbility組件間交互(設(shè)備內(nèi))說明
鴻蒙應(yīng)用開發(fā)入門資料合集
HarmonyOS/OpenHarmony應(yīng)用開發(fā)-Stage模型UIAbility組件使用(一)
HarmonyOS/OpenHarmony應(yīng)用開發(fā)-Stage模型UIAbility組件使用(一)
鴻蒙Ability Kit(程序框架服務(wù))【UIAbility組件啟動模式】
    
鴻蒙Ability Kit(程序框架服務(wù))【UIAbility組件基本用法】
    
鴻蒙Ability Kit(程序框架服務(wù))【UIAbility組件與UI的數(shù)據(jù)同步】
    
鴻蒙Ability Kit(程序框架服務(wù))【UIAbility組件間交互(設(shè)備內(nèi))】
    
鴻蒙Ability Kit(程序框架服務(wù))【UIAbility內(nèi)和UIAbility間頁面的跳轉(zhuǎn)】
    
【HarmonyOS 5】鴻蒙中的UIAbility詳解(三)
【HarmonyOS 5】鴻蒙中的UIAbility詳解(二)
    
          
        
        
鴻蒙開發(fā)丨設(shè)備內(nèi) UIAbility 的幾種交互方式
                
 
    
           
            
            
                
            
評論