鴻蒙OS Intent

2020-09-18 10:13 更新

基本概念

Intent 是對象之間傳遞信息的載體。例如,當一個 Ability 需要啟動另一個 Ability 時,或者一個 AbilitySlice 需要導航到另一個 AbilitySlice 時,可以通過 Intent 指定啟動的目標同時攜帶相關數(shù)據(jù)。Intent 的構成元素包括 Operation 與 Parameters,具體描述參見表1。

屬性 子屬性 描述
Operation Action 表示動作,通常使用系統(tǒng)預置Action,應用也可以自定義Action。例如IntentConstants.ACTION_HOME表示返回桌面動作。
Entity 表示類別,通常使用系統(tǒng)預置Entity,應用也可以自定義Entity。例如Intent.ENTITY_HOME表示在桌面顯示圖標。
Uri 表示Uri描述。如果在Intent中指定了Uri,則Intent將匹配指定的Uri信息,包括scheme, schemeSpecificPart, authority和path信息。
Flags 表示處理Intent的方式。例如Intent.FLAG_ABILITY_CONTINUATION標記在本地的一個Ability是否可以遷移到遠端設備繼續(xù)運行。
BundleName 表示包描述。如果在Intent中同時指定了BundleName和AbilityName,則Intent可以直接匹配到指定的Ability。
AbilityName 表示待啟動的Ability名稱。如果在Intent中同時指定了BundleName和AbilityName,則Intent可以直接匹配到指定的Ability。
DeviceId 表示運行指定Ability的設備ID。
Parameters - Parameters是一種支持自定義的數(shù)據(jù)結構,開發(fā)者可以通過Parameters傳遞某些請求所需的額外信息。

當 Intent 用于發(fā)起請求時,根據(jù)指定元素的不同,分為兩種類型:

  • 如果同時指定了 BundleName 與 AbilityName,則根據(jù) Ability 的全稱(例如,“com.demoapp.FooAbility”)來直接啟動應用。
  • 如果未同時指定 BundleName 和 AbilityName,則根據(jù) Operation 中的其他屬性來啟動應用。

根據(jù)Ability的全稱啟動應用

通過構造包含 BundleName 與 AbilityName 的 Operation 對象,可以啟動一個 Ability、并導航到該 Ability。示例代碼如下:

  1. Intent intent = new Intent();
  2. // 通過 Intent 中的 OperationBuilder 類構造 operation 對象,指定設備標識(空串表示當前設備)、應用包名、Ability 名稱
  3. Operation operation = new Intent.OperationBuilder()
  4. .withDeviceId("")
  5. .withBundleName("com.demoapp")
  6. .withAbilityName("com.demoapp.FooAbility")
  7. .build();
  8. // 把 operation 設置到 intent 中
  9. intent.setOperation(operation);
  10. startAbility(intent);

作為處理請求的對象,會在相應的回調方法中接收請求方傳遞的 Intent 對象。以導航到另一個 Ability 為例,導航的目標 Ability 可以在其 onStart() 回調的參數(shù)中獲得Intent對象。

根據(jù)Operation的其他屬性啟動應用

有些場景下,開發(fā)者需要在應用中使用其他應用提供的某種能力,而不感知提供該能力的具體是哪一個應用。例如開發(fā)者需要通過瀏覽器打開一個鏈接,而不關心用戶最終選擇哪一個瀏覽器應用,則可以通過 Operation 的其他屬性(除 BundleName 與 AbilityName 之外的屬性)描述需要的能力。如果設備上存在多個應用提供同種能力,系統(tǒng)則彈出候選列表,由用戶選擇由哪個應用處理請求。以下示例展示使用 Intent 跨 Ability 查詢天氣信息。

請求方

在 Ability 中構造 Intent 以及包含 Action 的 Operation 對象,并調用 startAbilityForResult() 方法發(fā)起請求。然后重寫 onAbilityResult() 回調方法,對請求結果進行處理。

  1. private void queryWeather() {
  2. Intent intent = new Intent();
  3. Operation operation = new Intent.OperationBuilder()
  4. .withAction(Intent.ACTION_QUERY_WEATHER)
  5. .build();
  6. intent.setOperation(operation);
  7. startAbilityForResult(intent, REQ_CODE_QUERY_WEATHER);
  8. }
  9. @Override
  10. protected void onAbilityResult(int requestCode, int resultCode, Intent resultData) {
  11. switch (requestCode) {
  12. case REQ_CODE_QUERY_WEATHER:
  13. // Do something with result.
  14. ...
  15. return;
  16. default:
  17. ...
  18. }
  19. }

處理方

  1. 作為處理請求的對象,首先需要在配置文件中聲明對外提供的能力,以便系統(tǒng)據(jù)此找到自身并作為候選的請求處理者。

  1. {
  2. "module": {
  3. ...
  4. "abilities": [
  5. {
  6. ...
  7. "skills":[
  8. {
  9. "actions":[
  10. "ability.intent.QUERY_WEATHER"
  11. ]
  12. }
  13. ]
  14. ...
  15. }
  16. ]
  17. ...
  18. }
  19. ...
  20. }

  1. 在 Ability 中配置路由以便支持以此 action 導航到對應的 AbilitySlice。

  1. @Override
  2. protected void onStart(Intent intent) {
  3. ...
  4. addActionRoute(Intent.ACTION_QUERY_WEATHER, DemoSlice.class.getName());
  5. ...
  6. }

  1. 在 Ability 中處理請求,并調用 setResult()方法暫存返回結果。

  1. @Override
  2. protected void onActive() {
  3. ...
  4. Intent resultIntent = new Intent();
  5. setResult(0, resultIntent);
  6. ...
  7. }
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號