Intent
基本概念
Intent 是對象之間傳遞信息的載體。例如,當一個 Ability 需要啟動另一個 Ability 時,或者一個 AbilitySlice 需要導航到另一個 AbilitySlice 時,可以通過 Intent 指定啟動的目標同時攜帶相關數據。Intent 的構成元素包括 Operation 與 Parameters,具體描述參見表 1。
表 1 Intent 的構成元素 當 Intent 用于發起請求時,根據指定元素的不同,分為兩種類型:
如果同時指定了 BundleName 與 AbilityName,則根據 Ability 的全稱(例如 “com.demoapp.FooAbility”)來直接啟動應用。
如果未同時指定 BundleName 和 AbilityName,則根據 Operation 中的其他屬性來啟動應用。
說明 Intent 設置屬性時,必須先使用 Operation 來設置屬性。如果需要新增或修改屬性,必須在設置 Operation
后再執行操作。
關于 Intent 最簡單的使用方法,可參見快速入門的示例代碼。其中 “實現頁面跳轉” 重點描述了使用 Intent 實現兩個頁面跳轉關系的操作。
根據 Ability 的全稱啟動應用
通過構造包含 BundleName 與 AbilityName 的 Operation 對象,可以啟動一個 Ability、并導航到該 Ability。示例代碼如下:
Intent intent = new Intent(); // 通過Intent中的OperationBuilder類構造operation對象,指定設備標識(空串表示當前設備)、應用包名、Ability名稱 Operation operation = new Intent.OperationBuilder() .withDeviceId("") .withBundleName("com.demoapp") .withAbilityName("com.demoapp.FooAbility") .build(); // 把operation設置到intent中 intent.setOperation(operation); startAbility(intent);
作為處理請求的對象,會在相應的回調方法中接收請求方傳遞的 Intent 對象。以導航到另一個 Ability 為例,導航的目標 Ability 可以在其 onStart () 回調的參數中獲得 Intent 對象。 根據 Operation 的其他屬性啟動應用 有些場景下,開發者需要在應用中使用其他應用提供的某種能力,而不感知提供該能力的具體是哪一個應用。例如開發者需要通過瀏覽器打開一個鏈接,而不關心用戶最終選擇哪一個瀏覽器應用,則可以通過 Operation 的其他屬性(除 BundleName 與 AbilityName 之外的屬性)描述需要的能力。如果設備上存在多個應用提供同種能力,系統則彈出候選列表,由用戶選擇由哪個應用處理請求。以下示例展示使用 Intent 跨 Ability 查詢天氣信息。
請求方
在 Ability 中構造 Intent 以及包含 Action 的 Operation 對象,并調用 startAbilityForResult () 方法發起請求。然后重寫 onAbilityResult () 回調方法,對請求結果進行處理。
private void queryWeather() { Intent intent = new Intent(); Operation operation = new Intent.OperationBuilder() .withAction(Intent.ACTION_QUERY_WEATHER) .build(); intent.setOperation(operation); startAbilityForResult(intent, REQ_CODE_QUERY_WEATHER); } @Override protected void onAbilityResult(int requestCode, int resultCode, Intent resultData) { switch (requestCode) { case REQ_CODE_QUERY_WEATHER: // Do something with result. ... return; default: ... } }
處理方 1、作為處理請求的對象,首先需要在配置文件中聲明對外提供的能力,以便系統據此找到自身并作為候選的請求處理者。
{ "module": { ... "abilities": [ { ... "skills":[ { "actions":[ "ability.intent.QUERY_WEATHER" ] } ] ... } ] ... } ... }
2、在 Ability 中配置路由以便支持以此 action 導航到對應的 AbilitySlice。
@Override protected void onStart(Intent intent) { ... addActionRoute(Intent.ACTION_QUERY_WEATHER, DemoSlice.class.getName()); ... }
3、在 Ability 中處理請求,并調用 setResult () 方法暫存返回結果。
@Override protected void onActive() { ... Intent resultIntent = new Intent(); setResult(0, resultIntent); //0為當前Ability銷毀后返回的resultCode。 ... } 審核編輯 黃宇
-
HarmonyOS
+關注
關注
79文章
1977瀏覽量
30264
發布評論請先 登錄
相關推薦
評論