鴻蒙進階——Framework之Want 隱式匹配機制概述

文章大綱

  • 引言
  • 一、Want概述
  • 二、Want的類型
    • 1、顯式Want
    • 2、隱式Want
    • 3、隱式Want的匹配
  • 三、隱式啟動Want 源碼概述
    • 1、有且僅有一個Ability匹配
    • 2、有多個Ability 匹配需要彈出選擇對話框
    • 3、ImplicitStartProcessor::ImplicitStartAbility
        • 3.1、GenerateAbilityRequestByAction
          • 3.1.1、GetBundleManagerHelper 獲取BMS對象
          • 3.1.2、GetBundleManagerHelper()->ImplicitQueryInfos
          • 3.1.3、ImplicitStartProcessor::FilterAbilityList
        • 3.2、定義回調
        • 3.3、根據dialogAppInfos和deviceType的組合進行不同的分支處理
      • 4、當有多個匹配結果時會先執行FilterAbilityList(有條件執行)
  • 小結

引言

在Android 中Activity及其他四大組件之間是通過Intent來傳遞信息的,在我們的鴻蒙操作系統中同樣有自己組件的“Intent”,今天我們介紹下鴻蒙中的“Intent”。

暫且對照著Android中的Intent 來理解。

一、Want概述

Want 是對象間信息傳遞的載體,可以用于應用組件間的信息傳遞。其使用場景之一是作為startAbility()的參數,包含了指定的啟動目標以及啟動時需攜帶的相關數據,如bundleName和abilityName字段分別指明目標Ability所在應用的包名以及對應包內的Ability名稱。當UIAbilityA啟動UIAbilityB并需要傳入一些數據給UIAbilityB時,Want可以作為一個載體將數據傳給UIAbilityB。

二、Want的類型

1、顯式Want

在啟動Ability時指定了abilityName和bundleName的Want稱為顯式Want。
當有明確處理請求的對象時,通過提供目標Ability所在應用的包名信息(bundleName),并在Want內指定abilityName便可啟動目標Ability。顯式Want通常用于在當前應用開發中啟動某個已知的Ability。

let wantInfo = {deviceId: '', // deviceId為空表示本設備bundleName: 'com.example.myapplication',abilityName: 'FuncAbility',
}

在這里插入圖片描述

2、隱式Want

當請求處理的對象不明確時,希望在當前應用中使用其他應用提供的某個能力(通過??skills標簽??定義),而不關心提供該能力的具體應用,可以使用隱式Want。例如使用隱式Want描述需要打開一個鏈接的請求,而不關心通過具體哪個應用打開,系統將匹配聲明支持該請求的所有應用。

3、隱式Want的匹配

根據系統中待匹配Ability的匹配情況不同,使用隱式Want啟動Ability時會出現以下三種情況。

  • 未匹配到滿足條件的Ability:啟動失敗。
  • 匹配到一個滿足條件的Ability:直接啟動該Ability。
  • 匹配到多個滿足條件的Ability(UIAbility):彈出選擇框讓用戶選擇。

匹配約束:

  • 調用方傳入的want參數中不帶有abilityName和bundleName,則不允許通過隱式Want啟動所有應用的ServiceExtensionAbility。
  • 調用方傳入的want參數中帶有bundleName,則允許使用startServiceExtensionAbility()方法隱式Want啟動ServiceExtensionAbility,默認返回優先級最高的ServiceExtensionAbility,如果優先級相同,返回第一個。
  let wantInfo: Want = {deviceId: "",action: "ohos.want.action.viewData",entities: ['entity.system.videoPlayer'],abilityName: "",uri: "",type: "",parameters: {}}

在這里插入圖片描述

通過上面表格可以除了bundleName和moduleName,只有uri、type、action、entities 字段參與匹配,換句話說提供相應能力的hap中的moudle.json5 里的skills 的這四個字段的值會影響到匹配結果。
在這里插入圖片描述

三、隱式啟動Want 源碼概述

foundation/ability/ability_runtime/services/abilitymgr/src/implicit_start_processor.cpp 處理隱式匹配規則
foundation/ability/ability_runtime/services/abilitymgr/src/system_dialog_scheduler.cpp 彈出模態對話框

1、有且僅有一個Ability匹配

在這里插入圖片描述

2、有多個Ability 匹配需要彈出選擇對話框

在這里插入圖片描述

3、ImplicitStartProcessor::ImplicitStartAbility

對應的代碼由ImplicitStartProcessor::ImplicitStartAbility開始處理,首先AbilityRequest的callType = 0,傳入的DeviceType為tablet,而社區默認是default。

3.1、GenerateAbilityRequestByAction

傳入std::vector dialogAppInfos、deviceType 成功創建AbilityRequest對象,

3.1.1、GetBundleManagerHelper 獲取BMS對象
3.1.2、GetBundleManagerHelper()->ImplicitQueryInfos
3.1.3、ImplicitStartProcessor::FilterAbilityList
3.2、定義回調
auto startAbilityTask = [imp = shared_from_this(), request, userId, identity](const std::string& bundle, const std::string& abilityName) mutable {HILOG_INFO("implicit start ability call back.");IPCSkeleton::SetCallingIdentity(identity);AAFwk::Want targetWant = request.want;targetWant.SetElementName(bundle, abilityName);auto callBack = [imp, targetWant, request, userId]() -> int32_t {return imp->ImplicitStartAbilityInner(targetWant, request, userId);};return imp->CallStartAbilityInner(userId, targetWant, callBack, request.callType);
};
3.3、根據dialogAppInfos和deviceType的組合進行不同的分支處理
  • dialogAppInfos.size() == 0 && (deviceType == STR_PHONE || deviceType == STR_DEFAULT

  • dialogAppInfos.size() == 0 && deviceType != STR_PHONE && deviceType != STR_DEFAULT

  • dialogAppInfos.size() == 0 && deviceType != STR_PHONE && deviceType != STR_DEFAULT

  • deviceType == STR_PHONE || deviceType == STR_DEFAULT
    DelayedSingleton::GetInstance()->GetSelectorDialogWant(dialogAppInfos, request.want, request.callerToken)

以上四種情況之外的

4、當有多個匹配結果時會先執行FilterAbilityList(有條件執行)

  • MatchTypeAndUri
  • AddAbilityInfoToDialogInfos
  • 循環從extensionInfos中獲取dialogAppInfo信息并存入dialogAppInfos
    在這里插入圖片描述

小結

彈出對話框的SelectorDialog_Service是一個ServiceExtensionAbility,進程為com.ohos.amsdialog,連接上Selector_Dialog_Service后會觸發其onCreate->OnRequest函數執行,createWindow時
在這里插入圖片描述

  private async createWindow(name: string, windowType: number, rect) {let deviceTypeInfo = deviceInfo.deviceType;console.info(TAG, 'create window');try {win = await window.create(globalThis.selectExtensionContext, name, windowType);if (windowType === window.WindowType.TYPE_DIALOG) {await win.bindDialogTarget(globalThis.callerToken.value, () => {win.destroyWindow();winNum--;if (winNum === 0) {globalThis.selectExtensionContext.terminateSelf();}});}if (deviceTypeInfo !== 'default') {await win.hideNonSystemFloatingWindows(true);}await win.moveTo(rect.left, rect.top);await win.resetSize(rect.width, rect.height);if (globalThis.params.deviceType === 'phone' || globalThis.params.deviceType === 'tablet') {await win.loadContent('pages/selectorPhoneDialog');} else {await win.loadContent('pages/selectorPcDialog');}await win.setBackgroundColor('#00000000');await win.show();} catch (e) {console.error(TAG, 'window create failed: ' + JSON.stringify(e));}}

然后去觸發方舟編譯器解包ams_system_dialog.hap執行,
在這里插入圖片描述
最終結論:
1、win.hideNonSystemFloatingWindows(true); 的父類實現中默認報異常中斷,所以需要在子類中實現該函數。(但是問題來了,里面的細節如何實現呢?社區中都是直接返回true)
2、在不同的設備上彈出的匹配對話框的位置和尺寸大小還需要適配,在
this.createWindow(‘SelectorDialog’ + startId, windowType, navigationBarRect);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906628.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906628.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906628.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Rules and Monetization

The system creates rules that allow them to monetize. The system doesn’t just enforce rules — it creates them strategically to monetize control. 🔧 How It Works: Invent a rule (e.g., “You need a permit to sell food.”)Claim it’s for safety …

java中string類型的list集合放到redis的5種數據類型的那種比較合適呢,可以用StringRedisTemplate實現

在Java中,如何將一個String類型的List集合存儲到Redis中,并且應該選擇Redis的哪種數據類型。同時,用戶還問到是否可以使用StringRedisTemplate來實現。 首先,我需要回憶一下Redis的5種主要數據類型:字符串(…

基于DQN的學習資源難度匹配智能體

基于DQN的學習資源難度匹配智能體 下面我將實現一個基于DQN(深度Q網絡)的智能體,用于根據用戶的學習表現動態匹配適合難度的學習資源。這個系統可以應用于在線教育平臺,根據用戶的歷史表現自動調整推薦資源的難度級別。 1. 環境設置 首先我們需要定義學習環境,這里我創建…

OrangePi Zero2開發指南:從SDK獲取到交叉編譯全流程詳解

一、OrangePi Zero2 SDK說明 SDK 全稱 Software Development Kit,即軟件開發工具包。一般包括了一些工具(如交叉編譯工具鏈)、庫、文檔和示例代碼。香橙派的Linux SDK其實指的就是 orangepi-build 這套代碼集,orangepibuild 在腳…

MATLAB NLP 工具箱 文本預處理教程

文章目錄 前言一、文本預處理核心步驟二、MATLAB 實現示例三、高級預處理技術四、預處理流程整合五、性能優化與注意事項六、實戰案例:IMDB 影評預處理 前言 以下是 MATLAB 自然語言處理 (NLP) 工具箱的文本預處理教程,涵蓋核心步驟、代碼實現及最佳實踐…

大模型的量化與雙重量化(1)

文章目錄 大模型量化的含義和作用什么是量化量化的作用具體示例 雙重量化的含義和作用什么是雙重量化雙重量化的具體實現雙重量化的作用具體示例對比實際應用場景 大模型量化的含義和作用 什么是量化 量化是指將神經網絡中的參數(權重和激活值)從高精度…

ES6 新增 API 方法

ES6 新增 API 方法 目錄 ES6 新增 API 方法背景介紹數組方法1. Array.from()2. Array.of()3. find/findIndex4. includes5. flat/flatMap 對象方法1. Object.assign()2. Object.keys/values/entries3. Object.getOwnPropertyDescriptors() 字符串方法1. includes/startsWith/en…

vscode使用ssh鏈接服務器

vscode SSH vscode先下載remote ssh的插件,隨后在左邊的菜單欄里選擇遠程。 點擊新建連接,輸入用戶名和地址,-p參數指定端口 ssh ubuntu{ip} -p xxx 隨后就可以正常連接了,這里使用普通用戶的用戶名密碼,別用root。 配…

基于FPGA的電子萬年歷系統開發,包含各模塊testbench

目錄 1.課題概述 2.系統仿真結果 3.核心程序與模型 4.系統原理簡介 5.完整工程文件 1.課題概述 基于FPGA的電子萬年歷系統開發,包含各模塊testbench。主要包含以下核心模塊: 時鐘控制模塊:提供系統基準時鐘和計時功能。 日歷計算模塊&#xff1a…

C++ 的 out_ptr 和 inout_ptr

1 問題的起因 1.1 T** 或 T&* ? C 的智能指針可以通過 get() 和 * 的重載得到原始指針 T*&#xff0c;遇到這樣的 C 風格的函數的時候&#xff1a; void Process(Foo *ptr);std::unique_ptr<Foo> sp ...;Process(sp.get()); //調用 Process 函數Process() 函數以…

取消 Conda 默認進入 Base 環境

在安裝 Conda 后&#xff0c;每次打開終端時默認會進入 base 環境。可以通過以下方法取消這一默認設置。 方法一&#xff1a;使用命令行修改配置 在終端中輸入以下命令&#xff0c;將 auto_activate_base 參數設置為 false&#xff1a; conda config --set auto_activate_ba…

數字計數--數位dp

1.不考慮前導零 2.每一位計數&#xff0c;就是有點“數頁碼”的意思 P2602 [ZJOI2010] 數字計數 - 洛谷 相關題目&#xff1a;記得加上前導零 數頁碼--數位dp-CSDN博客 https://blog.csdn.net/2301_80422662/article/details/148160086?spm1011.2124.3001.6209 #include…

Redis學習打卡-Day5-Redis 持久化

單點 Redis 的一些問題 數據丟失&#xff1a;Redis 是內存存儲&#xff0c;服務重啟可能會丟失數據。solution&#xff1a;實現 Redis 數據持久化。并發能力&#xff1a;單節點 Redis 并發能力雖然不錯&#xff0c;但也無法滿足如618這樣的高并發場景。solution&#xff1a;搭…

飛書知識問答深度體驗:企業AI應用落地的典范產品

飛書知識問答深度體驗&#xff1a;企業AI應用落地的典范產品 產品介紹-飛書知識問答是什么與常規通用大模型相比有何優點&#xff1f;大模型橫行的時代&#xff0c;飛書知識問答對普通人和企業有何影響呢&#xff1f; 場景示例-不同角色可以用飛書知識問答做什么&#xff1f;對…

Python打卡訓練營學習記錄Day34

知識點回歸&#xff1a; CPU性能的查看&#xff1a;看架構代際、核心數、線程數 GPU性能的查看&#xff1a;看顯存、看級別、看架構代際 GPU訓練的方法&#xff1a;數據和模型移動到GPU device上 類的call方法&#xff1a;為什么定義前向傳播時可以直接寫作self.fc1(x) CPU性…

Django的請求和響應+template模板

&#x1f31f; 如果這篇文章觸動了你的心弦&#xff0c;請不要吝嗇你的支持&#xff01; 親愛的讀者&#xff0c; 感謝你花時間閱讀這篇分享。希望這里的每一個字都能為你帶來啟發或是讓你會心一笑。如果你覺得這篇文章有價值&#xff0c;或者它解決了你一直以來的一個疑問&a…

Python |GIF 解析與構建(2):狀態機解析

Python &#xff5c;GIF 解析與構建&#xff08;2&#xff09;&#xff1a;狀態機解析 目錄 Python &#xff5c;GIF 解析與構建&#xff08;2&#xff09;&#xff1a;狀態機解析 引言 一、狀態機概述 狀態機的優勢與改進方向 總結 引言 在《Python &#xff5c;GIF 解…

PCB設計實踐(二十六)貼片電容與插件電容的全面解析:差異、演進與應用場景

一、核心差異&#xff1a;結構與性能對比 物理結構與封裝形式 貼片電容&#xff08;Surface Mount Device, SMD&#xff09;采用扁平化設計&#xff0c;外形多為長方體或圓柱體&#xff0c;直接通過焊盤固定在電路板表面。其封裝材料通常為陶瓷、聚合物或鋁電解層&#xff0c;外…

XC7A200T-2FFG1156I FPGA AMD Xilinx Artix-7

XC7A200T-2FFG1156I 是 AMD Xilinx Artix-7 系列的一款高性能低功耗 FPGA&#xff0c;采用 28 nm 高性能低功耗&#xff08;HPL&#xff09;工藝制造&#xff0c;核心電壓在 0.95 V–1.05 V 之間&#xff0c;可在 –40 C 至 100 C 工業溫度范圍內穩定工作 。 邏輯資源&#xff…

LVS + Keepalived + Nginx 高可用負載均衡系統實驗

1. 項目背景 在現代 Web 應用中&#xff0c;高可用性和負載均衡是至關重要的需求。本項目旨在通過 LVS&#xff08;Linux Virtual Server&#xff09;實現流量分發&#xff0c;通過 Keepalived 實現高可用性&#xff0c;通過 Nginx 提供后端服務。該架構能夠確保在單點故障的情…