一文教你快速了解鴻蒙分布式調(diào)度并開發(fā)數(shù)據(jù)庫相關(guān)應(yīng)用
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
1. 介紹
開發(fā)者在應(yīng)用中集成分布式調(diào)度能力,通過調(diào)用指定能力的分布式接口,實現(xiàn)跨設(shè)備能力調(diào)度。根據(jù)Ability模板及意圖的不同,分布式任務(wù)調(diào)度向開發(fā)者提供六種能力:啟動遠(yuǎn)程FA(Feature Ability)、啟動遠(yuǎn)程PA(Particle Ability)、關(guān)閉遠(yuǎn)程PA、連接遠(yuǎn)程PA、斷開連接遠(yuǎn)程PA和FA跨設(shè)備遷移。分布式任務(wù)調(diào)度的詳細(xì)介紹可以參考分布式任務(wù)調(diào)度。
🕮 說明
實現(xiàn)遠(yuǎn)程啟動FA,需要至少兩個設(shè)備處于同一個分布式網(wǎng)絡(luò)中,可以通過如下操作實現(xiàn):
1. 所有設(shè)備接入同一網(wǎng)絡(luò);
2. 所有設(shè)備登錄相同華為帳號;
3. 所有設(shè)備上開啟"設(shè)置->更多連接->多設(shè)備協(xié)同 "。
本教程以"基于分布式調(diào)度遠(yuǎn)程啟動FA"為例,結(jié)合權(quán)限申請、Button事件響應(yīng)、獲取設(shè)備列表、遠(yuǎn)程啟動FA的開發(fā)過程,讓您快速了解分布式調(diào)度能力。
2. 申請所需要的權(quán)限
在entry\src\main\config.json中申請以下4個權(quán)限:
1. ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE:用于允許監(jiān)聽分布式組網(wǎng)內(nèi)的設(shè)備狀態(tài)變化。
2. ohos.permission.GET_DISTRIBUTED_DEVICE_INFO:用于允許獲取分布式組網(wǎng)內(nèi)的設(shè)備列表和設(shè)備信息。
3. ohos.permission.GET_BUNDLE_INFO:用于查詢其他應(yīng)用的信息。
4. ohos.permission.DISTRIBUTED_DATASYNC:用于允許不同設(shè)備間的數(shù)據(jù)交換。
示例代碼如下:
- 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"
- }
- ]
- }
此外,還需要在實現(xiàn)Ability的代碼中顯式聲明需要使用多設(shè)備協(xié)同訪問的權(quán)限,示例代碼如下:
- public class MainAbility extends Ability {
- @Override
- public void onStart(Intent intent) {
- requestPermissionsFromUser(new String[]{"ohos.permission.DISTRIBUTED_DATASYNC"},0);
- super.onStart(intent);
- }
- }
3. 實現(xiàn)一個Button,響應(yīng)點擊事件
在MainAbilitySlice.java中開發(fā)一個頁面,并在頁面上繪制一個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 -> {
- // 處理按鈕響應(yīng),詳情請見第3步,獲取設(shè)備列表。
- });
- super.setUIContent(layout);
- }
4. 獲取設(shè)備列表
在遠(yuǎn)程啟動FA按鈕的響應(yīng)里面實現(xiàn)設(shè)備列表的獲取,使用DeviceManager.getDeviceList(int flag)獲取設(shè)備列表,flag通過傳入DeviceInfo.FLAG_GET_ONLINE_DEVICE查詢所有分布式網(wǎng)絡(luò)中的在線設(shè)備,通過解析返回的DeviceInfo列表對象,獲取待被遠(yuǎn)程啟動的FA的設(shè)備的deviceId。示例代碼如下:
- btn.setClickedListener(component -> {
- // 處理按鈕響應(yīng),獲取在線設(shè)備列表
- List<DeviceInfo> deviceInfoList =
- DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
- for (DeviceInfo deviceInfo : deviceInfoList) {
- // 遠(yuǎn)程啟動FA,詳情請見第4步
- }
- });
5. 遠(yuǎn)程啟動FA
構(gòu)建用于遠(yuǎn)程啟動FA的Intent,并遠(yuǎn)程啟動FA。其中的BUNDLE_NAME和ABILITY_NAME為全局變量,表示需要啟動的遠(yuǎn)程FA的BundleName(包名稱)和AbilityName(待啟動的Ability名稱)。示例代碼如下:
- // 遠(yuǎn)程啟動FA
- Intent remoteIntent = new Intent();
- // 指定待啟動FA的bundleName和abilityName
- // 例如:BUNDLE_NAME = "com.huawei.codelab"
- // ABILITY_NAME = "com.huawei.codelab.MainAbility"
- // 設(shè)置分布式標(biāo)記,表明當(dāng)前涉及分布式能力
- 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 {
- // 目標(biāo)設(shè)備是否包含指定FA
- List<AbilityInfo> abilityInfoList = getBundleManager().queryAbilityByIntent(remoteIntent, 0, 0);
- if (abilityInfoList != null && !abilityInfoList.isEmpty()) {
- startAbility(remoteIntent);
- }
- } catch (RemoteException e) {
- // 處理異常
- }
6. 完整示例
以手機(jī)為例,點擊頁面按鈕,會拉起同一網(wǎng)絡(luò)中的其余使用同一華為帳號登錄的手機(jī)上的指定FA,此處需要至少兩臺手機(jī)進(jìn)行驗證。實現(xiàn)效果如下:
示例代碼如下:
- 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 {
- //遠(yuǎn)程啟動FA的BundleName ,請自行填寫
- private static final String BUNDLE_NAME = "com.huawei.codelab";
- // 遠(yuǎn)程啟動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 -> {
- // 處理按鈕響應(yīng),獲取在線設(shè)備列
- List<DeviceInfo> deviceInfoList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
- for (DeviceInfo deviceInfo : deviceInfoList) {
- // 遠(yuǎn)程啟動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演示參考使用,產(chǎn)品化的代碼需要考慮數(shù)據(jù)校驗和國際化。
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)