🚀前言
應用中的信息傳遞是為了實現各種功能和交互。信息傳遞可以幫助用戶和應用之間進行有效的溝通和交流。通過信息傳遞,應用可以向用戶傳遞重要的消息、通知和提示,以提供及時的反饋和指導。同時,用戶也可以通過信息傳遞向應用發送指令、請求和反饋,以實現個性化的需求和操作。
信息傳遞還可以幫助應用之間實現數據的共享和交互。通過信息傳遞,不同應用可以實現數據的互通,以實現更多的功能和服務。例如,一個購物應用可以通過信息傳遞與支付應用進行數據交互,以實現支付功能;一個社交媒體應用可以通過信息傳遞與地圖應用進行數據交互,以實現位置分享功能。
此外,信息傳遞還可以幫助應用之間實現聯動和協作。通過信息傳遞,應用可以實現多個功能的組合和協同,以提供更加豐富和綜合的服務。例如,一個音樂應用可以與鬧鐘應用進行信息傳遞,以實現在特定時間播放特定的音樂。
🚀一、信息傳遞載體Want
🔎1.Want概述
🦋1.1 Want的定義與用途
HarmonyOS中的"Want"是一個用于定義和控制應用程序之間通信的基本概念。它可以用來描述一個應用程序對某個特定操作的需求或意愿,比如獲取某個設備的位置信息、訪問某個傳感器的數據等。
使用"Want"可以實現應用程序之間的無縫協作和互操作。通過定義和使用"Wants",應用程序可以根據自身的需求發送請求,并且可以接收和處理其他應用程序發送的請求。這種機制能夠促進應用程序之間的交互和共享,并且使得整個系統更加智能和高效。
"Wants"的使用可以帶來許多好處。首先,它可以簡化應用程序之間的通信和協作,減少開發人員的工作量。其次,它可以增強系統的靈活性和可擴展性,使得應用程序能夠動態地適應不同的環境和設備。最后,它可以提供更加個性化和智能化的用戶體驗,使得應用程序能夠更好地理解用戶的需求并作出相應的反應。
🦋1.2 Want的類型
在HarmonyOS中,信息傳遞載體Want的類型可以分為兩種:顯式Want和隱式Want。
顯式Want:顯式Want是指明確指定要操作的組件或服務的Want。通過顯式Want,可以精確地指定要傳遞給目標組件或服務的信息,并指定具體的要執行的操作。顯式Want會包含組件名和操作類型等明確的指令信息。例如,可以使用顯式Want來啟動指定的Activity或調用指定的服務。
let wantInfo = {deviceId: '', // deviceId為空表示本設備bundleName: 'com.example.myapplication',abilityName: 'FuncAbility',
}
隱式Want:隱式Want是指不明確指定要操作的組件或服務的Want,而是根據一定的規則和條件來進行匹配。通過隱式Want,可以實現組件之間的解耦和靈活性。隱式Want一般包含一組動作、類別、數據類型等條件,系統會根據這些條件來匹配合適的組件或服務。例如,可以使用隱式Want來處理某個特定類型的數據或根據某個特定的動作執行相應的操作。
let wantInfo = {// uncomment line below if wish to implicitly query only in the specific bundle.// bundleName: 'com.example.myapplication',action: 'ohos.want.action.search',// entities can be omittedentities: [ 'entity.system.browsable' ],uri: 'https://www.test.com:8080/query/student',type: 'text/plain',
};
🔎2.顯式Want與隱式Want匹配規則
🦋2.1 隱式Want匹配原理詳解
系統將調用方傳入的want參數(包含action、entities、uri和type屬性)與已安裝待匹配的應用Ability的skills配置(包含actions、entities、uris和type屬性)依次進行匹配。當四個屬性匹配均通過,則此應用才會被應用選擇器展示給用戶進行選擇。
??2.1.1 want參數的action匹配規則
??2.1.2 want參數的entities匹配規則
??2.1.3 want參數的uri和type匹配規則
??2.1.4 uri匹配規則
以下是根據給定匹配規則展示的表格:
待匹配Ability的skills配置的uris中scheme、host、port、path、pathStartWith和pathRegex屬性拼接,如果依次聲明了path、pathStartWith和pathRegex屬性時,uris將分別拼接為如下三種表達式:
-
全路徑表達式:scheme://host:port/path
-
前綴表達式:scheme://host:port/pathStartWith
-
正則表達式:scheme://host:port/pathRegex
??2.1.5 type匹配規則
🔎3.常見action與entities
🦋3.1 action
表示調用方要執行的通用操作(如查看、分享、應用詳情)
🦋3.2 entities
表示目標Ability的類別信息(如瀏覽器、視頻播放器)
🔎4.使用顯式Want啟動Ability
1、啟動方
新建callerAbility
2、被啟動方
同理新建calleeAbility
3、啟動方UI
import common from '@ohos.app.ability.common';
@Entry
@Component
struct Index {@State message: string = 'callerAbility'build() {Row() {Column() {Text('hello').fontSize(50).fontWeight(FontWeight.Bold)// A new button with will call explicitStartAbility() when clicked.Button("CLICKME").onClick(this.explicitStartAbility) // explicitStartAbility見下面示例代碼// ...}.width('100%')}.height('100%')}async explicitStartAbility() {try {// Explicit want with abilityName specified.let want = {deviceId: "",bundleName: "com.example.myapplication",abilityName: "calleeAbility"};let context = getContext(this) as common.UIAbilityContext;await context.startAbility(want);console.info(`explicit start ability succeed`);} catch (error) {console.info(`explicit start ability failed with ${error.code}`);}}
}
4、執行
🔎5.使用隱式Want打開網址
1、module.json5配置
"skills": [{"entities": ["entity.system.browsable"// ...],"actions": ["ohos.want.action.viewData"// ...],"uris": [{"scheme": "https","host": "www.test.com","port": "8080",// prefix matching"pathStartWith": "query","type": "text/*"},{"scheme": "http",// ...}// ...]},
]
2、定義跳轉函數
async implicitStartAbility() {try {let want = {// uncomment line below if wish to implicitly query only in the specific bundle.// bundleName: "com.example.myapplication","action": "ohos.want.action.viewData",// entities can be omitted."entities": [ "entity.system.browsable" ],"uri": "https://www.test.com:8080/query/student","type": "text/plain"}let context = getContext(this) as common.UIAbilityContext;await context.startAbility(want)console.info(`explicit start ability succeed`)} catch (error) {console.info(`explicit start ability failed with ${error.code}`)}}
3、運行
🔎6.應用間使用Want分享數據
1、分享方
讀取文件
import fileIO from '@ohos.fileio';// let path = ...
// file open where path is a variable contains the file path.
let fileFd = fileIO.openSync(path, 0o102, 0o666);
傳輸文件信息構造
import wantConstant from '@ohos.ability.wantConstant';// let path = ...
// let fileFd = ...
// let fileSize = ...
let want = {// This action is used to implicitly match the application selctor.action: wantConstant.Action.ACTION_SELECT,// This is the custom parameter in the first layer of want// which is intended to add info to application selector.parameters: {// The MIME type of pdf"ability.picker.type": "application/pdf","ability.picker.fileNames": [path],"ability.picker.fileSizes": [fileSize],// This a nested want which will be directly send to the user selected application. "ability.want.params.INTENT": {"action": "ohos.want.action.sendData","type": "application/pdf","parameters": {"keyFd": {"type": "FD", "value": fileFd}}}}
}
2、被分享方
定義skills
"skills": [{"entities": [// ...],"actions": ["ohos.want.action.sendData"// ...],"uris": [{"type": "application/pdf"},// ...]},
]
2、接收數據
onCreate(want, launchParam) {// note when keyFd is undefined, app crash will happen.if (want["parameters"]["keyFd"] !== undefined) {// receive file descriptorlet fd = want["parameters"]["keyFd"].value;// ...}
}
文章轉載自:蜀道山QAQ
原文鏈接:https://www.cnblogs.com/shudaoshan/p/18211814
體驗地址:引邁 - JNPF快速開發平臺_低代碼開發平臺_零代碼開發平臺_流程設計器_表單引擎_工作流引擎_軟件架構