一文教你快速了解鴻蒙分布式調度并開發數據庫相關應用
1. 介紹
開發者在應用中集成分布式調度能力,通過調用指定能力的分布式接口,實現跨設備能力調度。根據Ability模板及意圖的不同,分布式任務調度向開發者提供六種能力:啟動遠程FA(Feature Ability)、啟動遠程PA(Particle Ability)、關閉遠程PA、連接遠程PA、斷開連接遠程PA和FA跨設備遷移。分布式任務調度的詳細介紹可以參考分布式任務調度。
🕮 說明
實現遠程啟動FA,需要至少兩個設備處于同一個分布式網絡中,可以通過如下操作實現:
1. 所有設備接入同一網絡;
2. 所有設備登錄相同華為帳號;
3. 所有設備上開啟"設置->更多連接->多設備協同 "。
本教程以"基于分布式調度遠程啟動FA"為例,結合權限申請、Button事件響應、獲取設備列表、遠程啟動FA的開發過程,讓您快速了解分布式調度能力。
2. 申請所需要的權限
在entry\src\main\config.json中申請以下4個權限:
1. ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE:用于允許監聽分布式組網內的設備狀態變化。
2. ohos.permission.GET_DISTRIBUTED_DEVICE_INFO:用于允許獲取分布式組網內的設備列表和設備信息。
3. ohos.permission.GET_BUNDLE_INFO:用于查詢其他應用的信息。
4. ohos.permission.DISTRIBUTED_DATASYNC:用于允許不同設備間的數據交換。
示例代碼如下:
- module": {
- ......
- "reqPermissions": [
- {
- "name": "ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"
- },
- {
- "name": "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"
- },
- {
- "name": "ohos.permission.GET_BUNDLE_INFO"
- },
- {
- "name": "ohos.permission.DISTRIBUTED_DATASYNC"
- }
- ]
- }
此外,還需要在實現Ability的代碼中顯式聲明需要使用多設備協同訪問的權限,示例代碼如下:
- public class MainAbility extends Ability {
- @Override
- public void onStart(Intent intent) {
- requestPermissionsFromUser(new String[]{"ohos.permission.DISTRIBUTED_DATASYNC"},0);
- super.onStart(intent);
- }
- }
3. 實現一個Button,響應點擊事件
在MainAbilitySlice.java中開發一個頁面,并在頁面上繪制一個Button,示例代碼如下:
- @Override
- public void onStart(Intent intent) {
- super.onStart(intent);
- DirectionalLayout layout = new DirectionalLayout(this);
- ComponentContainer.LayoutConfig config = new ComponentContainer.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_PARENT,
- ComponentContainer.LayoutConfig.MATCH_PARENT);
- layout.setLayoutConfig(config);
- Button btn = new Button(getContext());
- ShapeElement buttonBg = new ShapeElement();
- buttonBg.setRgbColor(new RgbColor(0, 125, 255));
- buttonBg.setCornerRadius(25);
- btn.setBackground(buttonBg);
- ComponentContainer.LayoutConfig btnConfig = new ComponentContainer.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_PARENT,
- ComponentContainer.LayoutConfig.MATCH_CONTENT);
- btn.setLayoutConfig(btnConfig);
- btn.setTextSize(50);
- btn.setPadding(10, 10, 10, 10);
- btn.setText("Start Remote FA");
- layout.addComponent(btn);
- btn.setClickedListener(component -> {
- // 處理按鈕響應,詳情請見第3步,獲取設備列表。
- });
- super.setUIContent(layout);
- }
4. 獲取設備列表
在遠程啟動FA按鈕的響應里面實現設備列表的獲取,使用DeviceManager.getDeviceList(int flag)獲取設備列表,flag通過傳入DeviceInfo.FLAG_GET_ONLINE_DEVICE查詢所有分布式網絡中的在線設備,通過解析返回的DeviceInfo列表對象,獲取待被遠程啟動的FA的設備的deviceId。示例代碼如下:
- btn.setClickedListener(component -> {
- // 處理按鈕響應,獲取在線設備列表
- List<DeviceInfo> deviceInfoList =
- DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
- for (DeviceInfo deviceInfo : deviceInfoList) {
- // 遠程啟動FA,詳情請見第4步
- }
- });
5. 遠程啟動FA
構建用于遠程啟動FA的Intent,并遠程啟動FA。其中的BUNDLE_NAME和ABILITY_NAME為全局變量,表示需要啟動的遠程FA的BundleName(包名稱)和AbilityName(待啟動的Ability名稱)。示例代碼如下:
- // 遠程啟動FA
- Intent remoteIntent = new Intent();
- // 指定待啟動FA的bundleName和abilityName
- // 例如:BUNDLE_NAME = "com.huawei.codelab"
- // ABILITY_NAME = "com.huawei.codelab.MainAbility"
- // 設置分布式標記,表明當前涉及分布式能力
- Operation operation = new Intent.OperationBuilder().withDeviceId(deviceInfo.getDeviceId())
- .withBundleName(BUNDLE_NAME)
- .withAbilityName(ABILITY_NAME)
- .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
- .build();
- remoteIntent.setOperation(operation);
- try {
- // 目標設備是否包含指定FA
- List<AbilityInfo> abilityInfoList = getBundleManager().queryAbilityByIntent(remoteIntent, 0, 0);
- if (abilityInfoList != null && !abilityInfoList.isEmpty()) {
- startAbility(remoteIntent);
- }
- } catch (RemoteException e) {
- // 處理異常
- }
6. 完整示例
以手機為例,點擊頁面按鈕,會拉起同一網絡中的其余使用同一華為帳號登錄的手機上的指定FA,此處需要至少兩臺手機進行驗證。實現效果如下:
示例代碼如下:
- import ohos.aafwk.ability.AbilitySlice;
- import ohos.aafwk.content.Intent;
- import ohos.aafwk.content.Operation;
- import ohos.agp.colors.RgbColor;
- import ohos.agp.components.Button;
- import ohos.agp.components.ComponentContainer;
- import ohos.agp.components.DirectionalLayout;
- import ohos.agp.components.element.ShapeElement;
- import ohos.bundle.AbilityInfo;
- import ohos.distributedschedule.interwork.DeviceInfo;
- import ohos.distributedschedule.interwork.DeviceManager;
- import ohos.rpc.RemoteException;
- import java.util.List;
- public class MainAbilitySlice extends AbilitySlice {
- //遠程啟動FA的BundleName ,請自行填寫
- private static final String BUNDLE_NAME = "com.huawei.codelab";
- // 遠程啟動FA的AbilityName,請自行填寫
- private static final String ABILITY_NAME = "com.huawei.codelab.MainAbility";
- @Override
- public void onStart(Intent intent) {
- super.onStart(intent);
- DirectionalLayout layout = new DirectionalLayout(this);
- ComponentContainer.LayoutConfig config = new ComponentContainer.LayoutConfig(
- ComponentContainer.LayoutConfig.MATCH_PARENT,
- ComponentContainer.LayoutConfig.MATCH_PARENT);
- layout.setLayoutConfig(config);
- Button btn = new Button(getContext());
- ShapeElement buttonBg = new ShapeElement();
- buttonBg.setRgbColor(new RgbColor(0, 125, 255));
- buttonBg.setCornerRadius(25);
- btn.setBackground(buttonBg);
- ComponentContainer.LayoutConfig btnConfig = new ComponentContainer.LayoutConfig(
- ComponentContainer.LayoutConfig.MATCH_PARENT,
- ComponentContainer.LayoutConfig.MATCH_CONTENT);
- btn.setLayoutConfig(btnConfig);
- btn.setTextSize(50);
- btn.setPadding(10, 10, 10, 10);
- btn.setText("Start Remote FA");
- layout.addComponent(btn);
- btn.setClickedListener(component -> {
- // 處理按鈕響應,獲取在線設備列
- List<DeviceInfo> deviceInfoList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
- for (DeviceInfo deviceInfo : deviceInfoList) {
- // 遠程啟動FA
- Intent remoteIntent = new Intent();
- Operation operation = new Intent.OperationBuilder()
- .withDeviceId(deviceInfo.getDeviceId())
- .withBundleName(BUNDLE_NAME)
- .withAbilityName(ABILITY_NAME)
- .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
- .build();
- remoteIntent.setOperation(operation);
- try {
- List<AbilityInfo> abilityInfoList = getBundleManager().queryAbilityByIntent(remoteIntent, 0, 0);
- if (abilityInfoList != null && !abilityInfoList.isEmpty()) {
- startAbility(remoteIntent);
- }
- } catch (RemoteException e) {
- // 處理異常
- }
- }
- });
- super.setUIContent(layout);
- }
- }
🕮 說明
以上代碼僅demo演示參考使用,產品化的代碼需要考慮數據校驗和國際化。