鴻蒙OS Intent

2020-09-18 10:13 更新

基本概念

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

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

當(dāng) Intent 用于發(fā)起請(qǐng)求時(shí),根據(jù)指定元素的不同,分為兩種類(lèi)型:

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

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

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

Intent intent = new Intent();

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

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

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

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

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

請(qǐng)求方

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

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

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

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

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

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)