自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一文教你快速了解鴻蒙分布式調(diào)度并開發(fā)數(shù)據(jù)庫相關(guān)應(yīng)用

開發(fā) 分布式
文章由鴻蒙社區(qū)產(chǎn)出,想要了解更多內(nèi)容請前往:51CTO和華為官方戰(zhàn)略合作共建的鴻蒙技術(shù)社區(qū)https://harmonyos.51cto.com

[[389002]]

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 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ù)交換。

示例代碼如下:

  1. module": {  
  2. ......  
  3.    "reqPermissions": [  
  4.     {  
  5.        "name""ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"  
  6.      },  
  7.      {  
  8.        "name""ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"  
  9.      },  
  10.      {  
  11.        "name""ohos.permission.GET_BUNDLE_INFO"  
  12.      },  
  13.      {  
  14.        "name""ohos.permission.DISTRIBUTED_DATASYNC"  
  15.      }  
  16.   ]  

此外,還需要在實現(xiàn)Ability的代碼中顯式聲明需要使用多設(shè)備協(xié)同訪問的權(quán)限,示例代碼如下:

  1. public class MainAbility extends Ability {  
  2. @Override  
  3. public void onStart(Intent intent) {  
  4.     requestPermissionsFromUser(new String[]{"ohos.permission.DISTRIBUTED_DATASYNC"},0);  
  5.     super.onStart(intent);   
  6.   }  

3. 實現(xiàn)一個Button,響應(yīng)點擊事件

在MainAbilitySlice.java中開發(fā)一個頁面,并在頁面上繪制一個Button,示例代碼如下:

  1. @Override  
  2. public void onStart(Intent intent) {  
  3.     super.onStart(intent);  
  4.     DirectionalLayout layout = new DirectionalLayout(this);  
  5.     ComponentContainer.LayoutConfig config = new ComponentContainer.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_PARENT,   
  6.         ComponentContainer.LayoutConfig.MATCH_PARENT);  
  7.     layout.setLayoutConfig(config);  
  8.     Button btn = new Button(getContext());  
  9.     ShapeElement buttonBg = new ShapeElement();  
  10.     buttonBg.setRgbColor(new RgbColor(0, 125, 255));  
  11.     buttonBg.setCornerRadius(25);  
  12.     btn.setBackground(buttonBg);  
  13.     ComponentContainer.LayoutConfig btnConfig = new ComponentContainer.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_PARENT,   
  14.         ComponentContainer.LayoutConfig.MATCH_CONTENT);  
  15.     btn.setLayoutConfig(btnConfig);  
  16.     btn.setTextSize(50);  
  17.     btn.setPadding(10, 10, 10, 10);  
  18.     btn.setText("Start Remote FA");  
  19.     layout.addComponent(btn);  
  20.     btn.setClickedListener(component -> {  
  21.        // 處理按鈕響應(yīng),詳情請見第3步,獲取設(shè)備列表。  
  22.     });  
  23.     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。示例代碼如下:

  1. btn.setClickedListener(component -> {  
  2. // 處理按鈕響應(yīng),獲取在線設(shè)備列表       
  3. List<DeviceInfo> deviceInfoList =   
  4. DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);  
  5.     for (DeviceInfo deviceInfo : deviceInfoList) {   
  6.         // 遠(yuǎn)程啟動FA,詳情請見第4步  
  7.     }  
  8. }); 

5. 遠(yuǎn)程啟動FA

構(gòu)建用于遠(yuǎn)程啟動FA的Intent,并遠(yuǎn)程啟動FA。其中的BUNDLE_NAME和ABILITY_NAME為全局變量,表示需要啟動的遠(yuǎn)程FA的BundleName(包名稱)和AbilityName(待啟動的Ability名稱)。示例代碼如下:

  1. // 遠(yuǎn)程啟動FA  
  2. Intent remoteIntent = new Intent();  
  3. // 指定待啟動FA的bundleName和abilityName  
  4. // 例如:BUNDLE_NAME = "com.huawei.codelab"  
  5. //       ABILITY_NAME = "com.huawei.codelab.MainAbility"  
  6. // 設(shè)置分布式標(biāo)記,表明當(dāng)前涉及分布式能力  
  7. Operation operation = new Intent.OperationBuilder().withDeviceId(deviceInfo.getDeviceId())  
  8.     .withBundleName(BUNDLE_NAME)  
  9.     .withAbilityName(ABILITY_NAME)  
  10.     .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)  
  11.     .build();  
  12. remoteIntent.setOperation(operation);  
  13. try {  
  14.     // 目標(biāo)設(shè)備是否包含指定FA  
  15.     List<AbilityInfo> abilityInfoList = getBundleManager().queryAbilityByIntent(remoteIntent, 0, 0);  
  16.     if (abilityInfoList != null && !abilityInfoList.isEmpty()) {  
  17.         startAbility(remoteIntent);  
  18.     }  
  19. } catch (RemoteException e) {  
  20.     // 處理異常  

6. 完整示例

以手機(jī)為例,點擊頁面按鈕,會拉起同一網(wǎng)絡(luò)中的其余使用同一華為帳號登錄的手機(jī)上的指定FA,此處需要至少兩臺手機(jī)進(jìn)行驗證。實現(xiàn)效果如下:

示例代碼如下:

  1. import ohos.aafwk.ability.AbilitySlice;  
  2. import ohos.aafwk.content.Intent;  
  3. import ohos.aafwk.content.Operation;  
  4. import ohos.agp.colors.RgbColor;  
  5. import ohos.agp.components.Button;  
  6. import ohos.agp.components.ComponentContainer;  
  7. import ohos.agp.components.DirectionalLayout;  
  8. import ohos.agp.components.element.ShapeElement;  
  9. import ohos.bundle.AbilityInfo;  
  10. import ohos.distributedschedule.interwork.DeviceInfo;  
  11. import ohos.distributedschedule.interwork.DeviceManager;  
  12. import ohos.rpc.RemoteException;  
  13.   
  14. import java.util.List;  
  15.   
  16. public class MainAbilitySlice extends AbilitySlice {  
  17.     //遠(yuǎn)程啟動FA的BundleName ,請自行填寫  
  18.     private static final String BUNDLE_NAME = "com.huawei.codelab";  
  19.     // 遠(yuǎn)程啟動FA的AbilityName,請自行填寫  
  20.     private static final String ABILITY_NAME = "com.huawei.codelab.MainAbility";  
  21.   
  22.     @Override  
  23.     public void onStart(Intent intent) {  
  24.         super.onStart(intent);  
  25.         DirectionalLayout layout = new DirectionalLayout(this);  
  26.         ComponentContainer.LayoutConfig config = new ComponentContainer.LayoutConfig(  
  27.             ComponentContainer.LayoutConfig.MATCH_PARENT,   
  28.             ComponentContainer.LayoutConfig.MATCH_PARENT);  
  29.         layout.setLayoutConfig(config);  
  30.         Button btn = new Button(getContext());  
  31.         ShapeElement buttonBg = new ShapeElement();  
  32.         buttonBg.setRgbColor(new RgbColor(0, 125, 255));  
  33.         buttonBg.setCornerRadius(25);  
  34.         btn.setBackground(buttonBg);  
  35.         ComponentContainer.LayoutConfig btnConfig = new ComponentContainer.LayoutConfig(  
  36.             ComponentContainer.LayoutConfig.MATCH_PARENT,   
  37.             ComponentContainer.LayoutConfig.MATCH_CONTENT);  
  38.         btn.setLayoutConfig(btnConfig);  
  39.         btn.setTextSize(50);  
  40.         btn.setPadding(10, 10, 10, 10);  
  41.         btn.setText("Start Remote FA");  
  42.         layout.addComponent(btn);  
  43.         btn.setClickedListener(component -> {  
  44.             // 處理按鈕響應(yīng),獲取在線設(shè)備列  
  45.             List<DeviceInfo> deviceInfoList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);  
  46.             for (DeviceInfo deviceInfo : deviceInfoList) {  
  47.                 // 遠(yuǎn)程啟動FA  
  48.                 Intent remoteIntent = new Intent();  
  49.                 Operation operation = new Intent.OperationBuilder()  
  50.                     .withDeviceId(deviceInfo.getDeviceId())  
  51.                     .withBundleName(BUNDLE_NAME)  
  52.                     .withAbilityName(ABILITY_NAME)  
  53.                     .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)  
  54.                     .build();  
  55.                 remoteIntent.setOperation(operation);  
  56.                 try {  
  57.                     List<AbilityInfo> abilityInfoList = getBundleManager().queryAbilityByIntent(remoteIntent, 0, 0);  
  58.                     if (abilityInfoList != null && !abilityInfoList.isEmpty()) {  
  59.                         startAbility(remoteIntent);  
  60.                     }  
  61.                 } catch (RemoteException e) {  
  62.                     // 處理異常  
  63.                 }  
  64.             }  
  65.         });  
  66.         super.setUIContent(layout);  
  67.     }  

🕮 說明

以上代碼僅demo演示參考使用,產(chǎn)品化的代碼需要考慮數(shù)據(jù)校驗和國際化。

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2022-02-20 09:56:28

TCPIP網(wǎng)絡(luò)協(xié)議

2023-07-31 21:56:54

哨兵系統(tǒng)redis

2020-04-14 11:14:02

PostgreSQL分布式數(shù)據(jù)庫

2020-12-22 10:02:53

ZabbixMySQL數(shù)據(jù)庫

2022-12-21 08:40:05

限流器分布式限流

2017-09-04 14:46:10

分布式事務(wù)問題

2016-10-25 14:35:05

分布式系統(tǒng) 存儲

2020-01-03 09:00:00

數(shù)據(jù)庫數(shù)據(jù)庫管理金融

2022-07-28 09:02:41

文件存儲系統(tǒng)

2020-10-28 11:15:24

EPaxos分布式性算法

2021-08-16 09:55:41

鴻蒙HarmonyOS應(yīng)用

2019-07-23 07:30:16

2023-12-27 07:40:43

HTTP服務(wù)器負(fù)載均衡

2023-05-11 08:26:56

2019-08-07 10:44:28

MySQLGoogle

2015-06-30 12:49:27

HBaseNoSQL分布式

2022-07-13 09:53:58

分布式開發(fā)

2022-09-05 07:32:46

mock數(shù)據(jù)Stream

2024-12-19 15:00:00

數(shù)據(jù)清洗Python

2021-12-07 06:02:15

Redis Docker運維
點贊
收藏

51CTO技術(shù)棧公眾號