鴻蒙系統中Intent的使用

前進道路上的程式猿發表於2020-11-17

官方文件解釋

Intent常用用於頁面跳轉或者模組之間跳轉時使用的工具,通常頁面之間傳遞資訊需要用到這個,那麼首先我們來開下官方是怎麼定義的

基本概念

Intent是物件之間傳遞資訊的載體。例如,當一個Ability需要啟動另一個Ability時,或者一個AbilitySlice需要導航到另一個AbilitySlice時,可以通過Intent指定啟動的目標同時攜帶相關資料。Intent的構成元素包括Operation與Parameters,具體描述參見表1。在這裡插入圖片描述
當Intent用於發起請求時,根據指定元素的不同,分為兩種型別:

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

話不多說,我們直接在案例中探尋

案例

指定BundleName與AbilityName實現跳轉

這個是最常用的一種跳轉方法,在之前部落格“開發鴻蒙的第一個Hello World的Java頁面以及頁面間跳轉功能實現”中已經提到過,這裡就不重複講

未指定BundleName和AbilityName實現跳轉

這種方法可以實現一個應用呼叫另一個應用的能力,類似於手機上有多個瀏覽器,當開啟連結時可以挑選某一個瀏覽器開啟,具體操作如下

被呼叫應用改造

新建被呼叫應用wear4

在DevEco Studio中我們點選file->new->new project
在這裡插入圖片描述

輸入專案名稱為wear4
在這裡插入圖片描述

新建DemoAbilitySlice

在slice將MainAbilitySlice複製貼上一下,將新檔名稱改為DemoAbilitySlice
在這裡插入圖片描述
將DemoAbilitySlice頁面顯示的文字改為“wear demo”
在這裡插入圖片描述

MainAbility中新增路由

MainAbility 如下:

public class MainAbility extends Ability {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setMainRoute(MainAbilitySlice.class.getName());
        addActionRoute(Intent.ACTION_QUERY_WEATHER, DemoAbilitySlice.class.getName());
    }
}

config.json改造

作為處理請求的物件,首先需要在配置檔案中宣告對外提供的能力,以便系統據此找到自身並作為候選的請求處理者
在這裡插入圖片描述

呼叫應用改造

我們的呼叫應用為wear22,其新建過程參考前面部落格“開發鴻蒙的第一個Hello World的Java頁面以及頁面間跳轉功能實現”

改造MainAbilitySlice

在MainAbilitySlice中,首先定義一個全域性變數

private static final int REQ_CODE_QUERY_WEATHER = 000000;

新建queryWeather方法用於呼叫其它應用

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);
    }

這裡我們發現沒有使用withBundleName和withAbilityName,而是使用.withAction(Intent.ACTION_QUERY_WEATHER),有這個配置後就會搜尋有相關配置的相關頁面

改造onAbilityResult方法

接下來我們改造onAbilityResult方法用於返回時呼叫

@Override
    protected void onAbilityResult(int requestCode, int resultCode, Intent resultData) {
        switch (requestCode) {
            case REQ_CODE_QUERY_WEATHER:
                return;
            default:
        }
    }

按鈕監聽呼叫queryWeather()

@Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_main_layout); // 載入XML佈局
        Button button = (Button) findComponentById(ResourceTable.Id_button);

        if (button != null) {
            // 為按鈕設定點選回撥
            button.setClickedListener(new Component.ClickedListener() {
                @Override
                public void onClick(Component component) {
                    queryWeather();
                }
            });
        }
    }

斷點除錯

呼叫與被呼叫方打斷點

我們在wear4的DemoAbilitySlice的onActive打上斷點

在這裡插入圖片描述

在wear22的MainAbilitySlice的onAbilityResult方法內打上斷點

在這裡插入圖片描述

以debug方式啟動兩個應用

手錶模擬器啟動後,分別以debug方式啟動兩個應用
在這裡插入圖片描述

回到wear22主頁面

點選圓圈回到主頁,然後點選圓圈到應用列表,進入wear22應用
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

點選除錯

點選按鈕,可以看到執行緒進入wear4專案中DemoAbilitySlice的onActive斷點中了,按F9後執行緒跑下去,再看手錶,頁面跳轉到DemoAbilitySlice中去了
在這裡插入圖片描述
點選返回按鈕
在這裡插入圖片描述
執行緒又執行到wear22專案中MainAbilitySlice的onAbilityResult的斷點中去了
在這裡插入圖片描述
且頁面回到了wear22主頁面了
在這裡插入圖片描述

總結:1.Intent的Operation可以實現不指定特定包和特定AbilityName就能是是實現跳轉,只需要配置withAction,然後startAbilityForResult實現跳轉
2.同時被呼叫的應用的配置檔案中宣告對外提供的能力
3.跳轉後會呼叫被呼叫頁面的onActive()方法
4.當返回後,會呼叫回掉方法onAbilityResult

相關文章