鴻蒙OS Intent

2020-09-18 10:13 更新

基本概念

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

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

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

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

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

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

Intent intent = new Intent();

 
// 通過 Intent 中的 OperationBuilder 類構(gòu)造 operation 對象,指定設(shè)備標識(空串表示當前設(shè)備)、應(yīng)用包名、Ability 名稱
Operation operation = new Intent.OperationBuilder()
        .withDeviceId("")
        .withBundleName("com.demoapp")
        .withAbilityName("com.demoapp.FooAbility")
        .build();

 
// 把 operation 設(shè)置到 intent 中
intent.setOperation(operation);
startAbility(intent);

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

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

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

請求方

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

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

   {
       "module": {
           ...
           "abilities": [
               {
                   ...
                   "skills":[
                       {
                           "actions":[
                               "ability.intent.QUERY_WEATHER"
                           ]
                       }
                   ]
                   ...
               }
           ]
           ...
       }
       ...
   }

  1. 在 Ability 中配置路由以便支持以此 action 導(dǎo)航到對應(yīng)的 AbilitySlice。

   @Override
   protected void onStart(Intent intent) {
       ...
       addActionRoute(Intent.ACTION_QUERY_WEATHER, DemoSlice.class.getName());
       ...
   }

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

   @Override
   protected void onActive() {
       ...
       Intent resultIntent = new Intent();
       setResult(0, resultIntent);
       ...
   }
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號