在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙開發【分布式任務調度】解析

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-01-29 18:03 ? 次閱讀

鴻蒙OS 分布式任務調度概述

HarmonyO S中,分布式任務調度平臺對搭載 HarmonyOS 的多設備構筑的“超級虛擬終端”提供統一的組件管理能力,為應用定義統一的能力基線、接口形式、數據結構、服務描述語言,屏蔽硬件差異;支持遠程啟動、遠程調用、業務無縫遷移等分布式任務。

分布式任務調度平臺在底層實現 Ability(分布式任務調度的基本組件)跨設備的啟動/關閉、連接及斷開連接以及遷移等能力,實現跨設備的組件管理:

  • 啟動和關閉:向開發者提供管理遠程 Ability 的能力,即支持啟動 Page 模板的 Ability,以及啟動、關閉 Service 和 Data 模板的 Ability。
  • 連接和斷開連接:向開發者提供跨設備控制服務( Service 和 Data 模板的 Ability )的能力,開發者可以通過與遠程服務連接及斷開連接實現獲取或注銷跨設備管理服務的對象,達到和本地一致的服務調度。
  • 遷移能力:向開發者提供跨設備業務的無縫遷移能力,開發者可以通過調用 Page 模板 Ability 的遷移接口,將本地業務無縫遷移到指定設備中,打通設備間壁壘。

約束與限制

  • 開發者需要在 Intent 中設置支持分布式的標記(例如:Intent.FLAG_ABILITYSLICE_MULTI_DEVICE 表示該應用支持分布式調度),否則將無法獲得分布式能力。
  • 開發者通過在 config.json 中添加分布式數據傳輸的權限申請:{"name": "ohos.permission.servicebus.ACCESS_SERVICE"},獲取跨設備連接的能力。
  • PA( Particle Ability,Service 和 Data 模板的 Ability)的調用支持連接及斷開連接、啟動及關閉這四類行為,在進行調度時:
  • 開發者必須在 Intent 中指定 PA 對應的 bundleName 和 abilityName。
  • 當開發者需要跨設備啟動、關閉或連接 PA 時,需要在 Intent 中指定對端設備的 deviceId。開發者可通過如設備管理類 DeviceManager 提供的 getDeviceList 獲取指定條件下匿名化處理的設備列表,實現對指定設備 PA 的啟動/關閉以及連接管理。
  • FA(Feature Ability,Page 模板的 Ability)的調用支持啟動和遷移行為,在進行調度時:
  • 當啟動 FA 時,需要開發者在 Intent 中指定對端設備的 deviceId、bundleName 和 abilityName。
  • FA 的遷移實現相同 bundleName 和 abilityName 的 FA 跨設備遷移,因此需要指定遷移設備的 deviceId。

鴻蒙OS 發布式任務調度開發指導

場景介紹

開發者在應用中集成分布式調度能力,通過調用指定能力的分布式接口,實現跨設備能力調度。根據 Ability 模板及意圖的不同,分布式任務調度向開發者提供以下六種能力:啟動遠程 FA、啟動遠程 PA、關閉遠程 PA、連接遠程 PA、斷開連接遠程 PA 和 FA 跨設備遷移。下面以設備 A(本地設備)和設備 B(遠端設備)為例,進行場景介紹:

  • 設備 A 啟動設備 B 的 FA:在設備 A 上通過本地應用提供的啟動按鈕,啟動設備 B 上對應的 FA。例如:設備 A 控制設備 B 打開相冊,只需開發者在啟動 FA 時指定打開相冊的意圖即可。
  • 設備 A 啟動設備 B 的 PA:在設備 A 上通過本地應用提供的啟動按鈕,啟動設備 B 上指定的 PA。例如:開發者在啟動遠程服務時通過意圖指定音樂播放服務,即可實現設備 A 啟動設備 B 音樂播放的能力。
  • 設備 A 關閉設備 B 的 PA:在設備 A 上通過本地應用提供的關閉按鈕,關閉設備 B 上指定的 PA。類似啟動的過程,開發者在關閉遠程服務時通過意圖指定音樂播放服務,即可實現關閉設備 B 上該服務的能力。
  • 設備 A 連接設備 B 的 PA:在設備 A 上通過本地應用提供的連接按鈕,連接設備 B 上指定的 PA。連接后,通過其他功能相關按鈕實現控制對端 PA 的能力。通過連接關系,開發者可以實現跨設備的同步服務調度,實現如大型計算任務互助等價值場景。
  • 設備 A 與設備 B 的 PA 斷開連接:在設備 A 上通過本地應用提供斷開連接的按鈕,將之前已連接的 PA 斷開連接。
  • 設備 A 的 FA 遷移至設備B:設備 A 上通過本地應用提供的遷移按鈕,將設備 A 的業務無縫遷移到設備B中。通過業務遷移能力,打通設備 A 和設備 B 間的壁壘,實現如文檔跨設備編輯、視頻從客廳到房間跨設備接續播放等場景。

接口說明

分布式調度平臺提供的連接和斷開連接 PA、啟動遠程 FA、啟動和關閉 PA 以及遷移 FA 的能力,是實現更多價值性場景的基礎。

  • 連接遠程PA

connectAbility(Intent intent, IAbilityConnection conn)接口提供連接指定設備上 PA 的能力,Intent 中指定待連接 PA 的設備 deviceId、bundleName 和 abilityName。當連接成功后,通過在 conn 定義的 onAbilityConnectDone 回調中獲取對端 PA 的服務代理,兩者的連接關系則由 conn 維護。具體的參數定義如下表所示:

參數名<>類型<>說明<>
intent<>ohos.aafwk.content.Intent<>開發者需在 intent 對應的Operation 中指定待連接 PA 的設備 deviceId、bundleName 和 abilityName。<>
conn<>ohos.aafwk.ability.IAbilityConnection<>當連接成功或失敗時,作為連接關系的回調接口。該接口提供連接完成和斷開連接完成時的處理邏輯,開發者可根據具體的場景進行定義。<>
  • 啟動遠程FA/PA startAbility(Intent intent) 接口提供啟動指定設備上 FA 和 PA 的能力,Intent 中指定待啟動 FA/PA 的設備 deviceId、bundleName 和 abilityName。具體參數定義如下表所示:
參數名<>類型<>說明<>
intent<>ohos.aafwk.content.Intent<>當開發者需要調用該接口啟動遠程 PA 時,需要指定待啟動 PA 的設備 deviceId、bundleName 和 abilityName。若不指定設備deviceId,則無法跨設備調用 PA。類似地,在啟動FA時,也需要開發者指定啟動 FA 的設備 deviceId、bundleName 和 abilityName。<>

分布式調度平臺還會提供與上述功能相對應的斷開遠程 PA 的連接和關閉遠程 PA 的接口,相關的參數與連接、啟動的接口類似。

1.斷開遠程 PA 連接:disconnectAbility (IAbilityConnection conn)。 2.關閉遠程 PA:boolean stopAbility (Intent intent)。

  • 遷移FA

continueAbility(String deviceId)接口提供將本地FA遷移到指定設備上的能力,需要開發者在調用時指定目標設備的 deviceId。具體參數定義如下表所示:

說明

Ability 和 AbilitySlice 類均需要實現 IAbilityContinuation 及其方法,才可以實現 FA 遷移。

參數名<>類型<>說明<>
deviceId<>String<>當開發者需要調用該接口將本地 FA 遷移時,需要指定目標設備的 deviceId。<>

開發步驟

  • 導入功能依賴的包。
// 以下依賴包含分布式調度平臺開放的接口,用于:連接/斷開連接遠程 PA、啟動遠程 FA、通過連接關系注冊的回調函數 onAbilityConnectDon e中返回的對端 PA 的代理,實現對PA的控制
   import ohos.aafwk.ability.AbilitySlice;
   import ohos.aafwk.ability.IAbilityConnection;
   import ohos.aafwk.content.Intent;
   import ohos.aafwk.content.Operation;
   import ohos.bundle.ElementName;
   // 為了實現遷移能力,需要引入傳遞遷移所需數據的包以及實現遷移能力的接口。
   import ohos.aafwk.ability.IAbilityContinuation;
   import ohos.aafwk.content.IntentParams;
   // 為了實現跨設備指令及數據通信,需要集成 HarmonyOS 提供的 RPC 接口
   import ohos.rpc.IRemoteObject;
   import ohos.rpc.IRemoteBroker;
   import ohos.rpc.MessageParcel;
   import ohos.rpc.MessageOption;
   import ohos.rpc.RemoteException;
   import ohos.rpc.RemoteObject;
   //(可選)多設備場景下涉及設備選擇,為此需要引入組網設備發現的能力
   import ohos.distributedschedule.interwork.DeviceInfo;
   import ohos.distributedschedule.interwork.DeviceManager;
   // (可選)設計界面相關的包函數,對 FA 界面及按鈕進行繪制
   import ohos.agp.components.Button;
   import ohos.agp.components.Component;
   import ohos.agp.components.Component.ClickedListener;
   import ohos.agp.components.ComponentContainer.LayoutConfig;
   import ohos.agp.components.element.ShapeElement;
   import ohos.agp.components.PositionLayout;
   import ohos.agp.components.PositionLayout;
import ohos.agp.components.PositionLayout;
  • (可選)編寫一個基本的 FA 用于使用分布式能力。
// 調用 AbilitySlice 模板實現一個用于控制基礎功能的 FA
   // Ability 和 AbilitySlice 類均需要實現 IAbilityContinuation 及其方法,才可以實現 FA 遷移。AbilitySlice 的代碼示例如下
   public class SampleSlice extends AbilitySlice implements IAbilityContinuation {
       @Override
       public void onStart(Intent intent) {
           super.onStart(intent);
           // 開發者可以自行進行界面設計
           // 為按鈕設置統一的背景色
           // 例如通過PositionLayout指定大小可以實現簡單界面
           PositionLayout layout = new PositionLayout(this);
           LayoutConfig config = new LayoutConfig(LayoutConfig.MATCH_PARENT, LayoutConfig.MATCH_PARENT);
           layout.setLayoutConfig(config);
           ShapeElement buttonBg = new ShapeElement();
           buttonBg.setRgbColor(new RgbColor(0,125,255));
           addComponents(layout, buttonBg, config);
           super.setUIContent(layout);
       }
    
       @Override
       public void onInactive() {
           super.onInactive();
       }
    
       @Override
       public void onActive() {
           super.onActive();
       }
    
       @Override
       public void onBackground() {
           super.onBackground();
       }
    
       @Override
       public void onForeground(Intent intent) {
           super.onForeground(intent);
       }
    
       @Override
       public void onStop() {
           super.onStop();
       }
   }
   }
}

說明

此步驟展示了一個簡單 FA 的實現過程,實際開發中請開發者根據需要進行設計。

  • (可選)為不同的能力設置相應的控制按鈕。
// 建議開發者按照自己的界面進行按鈕設計
   // 開發者可以自行實現如 createButton 的方法,新建一個顯示文字 text,背景色為 buttonBg 以及大小尺寸位置符合 config 設置的按鈕,用來與用戶發生交互
   // private Button createButton(String text, ShapeElement buttonBg, LayoutConfig config)
   // 按照順序在 PositionLayout 中依次添加按鈕的示例
   private void addComponents(PositionLayout linear, ShapeElement buttonBg, LayoutConfig config) {
       // 構建遠程啟動FA的按鈕
       btnStartRemoteFA = createButton("StartRemoteFA", buttonBg, config);
       btnStartRemoteFA.setClickedListener(mStartRemoteFAListener);
       linear.addComponent(btnStartRemoteFA);
       // 構建遠程啟動PA的按鈕
       btnStartRemotePA = createButton("StartRemotePA", buttonBg, config);
       btnStartRemotePA.setClickedListener(mStartRemotePAListener);
       linear.addComponent(btnStartRemotePA);
       // 構建遠程關閉PA的按鈕
       btnStopRemotePA = createButton("StopRemotePA", buttonBg, config);
       btnStopRemotePA.setClickedListener(mStopRemotePAListener);
       linear.addComponent(btnStopRemotePA);
       // 構建連接遠程PA的按鈕
       btnConnectRemotePA = createButton("ConnectRemotePA", buttonBg, config);
       btnConnectRemotePA.setClickedListener(mConnectRemotePAListener);
       linear.addComponent(btnConnectRemotePA);
       // 構建控制連接PA的按鈕
       btnControlRemotePA = createButton("ControlRemotePA", buttonBg, config);
       btnControlRemotePA.setClickedListener(mControlPAListener);
       linear.addComponent(btnControlRemotePA);
       // 構建與遠程PA斷開連接的按鈕
       btnDisconnectRemotePA = createButton("DisconnectRemotePA", buttonBg, config);
       btnDisconnectRemotePA.setClickedListener(mDisconnectRemotePAListener);
       linear.addComponent(btnDisconnectRemotePA);
       // 構建遷移FA的按鈕
       btnContinueRemoteFA = createButton("ContinueRemoteFA", buttonBg, config);
       btnContinueRemoteFA.setClickedListener(mContinueAbilityListener);
       linear.addComponent(btnContinueRemoteFA);
   }
   }
}

說明

此處只展示了基于按鈕控制的能力調度方法,實際開發中請開發者根據需要選擇能力調度方式。代碼示例中未體現按鈕如位置、樣式等具體的設置方法,詳請參考 JAVA UI框架。

  • 通過設備管理 DeviceManager 提供的 getDeviceList 接口獲取設備列表,用于指定目標設備。
// ISelectResult 是一個自定義接口,用來處理指定設備 deviceId 后執行的行為
    interface ISelectResult {
        void onSelectResult(String deviceId);
    }
    
   // 獲得設備列表,開發者可在得到的在線設備列表中選擇目標設備執行操作
   private void scheduleRemoteAbility(ISelectResult listener) {
       // 調用DeviceManager的getDeviceList接口,通過FLAG_GET_ONLINE_DEVICE標記獲得在線設備列表
       List< DeviceInfo > onlineDevices = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
       // 判斷組網設備是否為空
       if (onlineDevices.isEmpty()) {
           listener.onSelectResult(null);
           return;
       }
       int numDevices = onlineDevices.size();
       ArrayList< String > deviceIds = new ArrayList<  >(numDevices);
       ArrayList< String > deviceNames = new ArrayList<  >(numDevices);
       onlineDevices.forEach((device) - > {
           deviceIds.add(device.getDeviceId());
           deviceNames.add(device.getDeviceName());
       });
       // 以選擇首個設備作為目標設備為例
       // 開發者也可按照具體場景,通過別的方式進行設備選擇
       String selectDeviceId = deviceIds.get(0);
       listener.onSelectResult(selectDeviceId);    
   }
   }
}

上述實例中涉及對在線組網設備的查詢,該項能力需要開發者在對應的 config.json 中聲明獲取設備列表及設備信息的權限,如下所示:

{
       "reqPermissions": [
           {
               "name": "ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"
           }, 
           {
               "name": "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"
           }, 
           {
               "name": "ohos.permission.GET_BUNDLE_INFO"
           }
       ]
   }
   }
}
  • 為啟動遠程 FA 的按鈕設置點擊回調,實現啟動遠程 FA 的能力。
// 啟動一個指定 bundleName 和 abilityName 的 FA
   private ClickedListener mStartRemoteFAListener = new ClickedListener() {
       @Override
       public void onClick(Component arg0) {
           // 啟動遠程PA
           scheduleRemoteAbility(new ISelectResult() {
               @Override
               void onSelectResult(String deviceId) {
                   if (deviceId != null) {
                       Intent intent = new Intent();
                       // 通過scheduleRemoteAbility指定目標設備deviceId
                       // 指定待啟動FA的bundleName和abilityName
                       // 例如:bundleName = "com.huawei.helloworld"
                       //       abilityName = "com.huawei.helloworld.SampleFeatureAbility"
                       // 設置分布式標記,表明當前涉及分布式能力
                       Operation operation = new Intent.OperationBuilder()
                               .withDeviceId(deviceId)
                               .withBundleName(bundleName)
                               .withAbilityName(abilityName)
                               .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
                               .build();
                       intent.setOperation(operation);
                       // 通過AbilitySlice包含的startAbility接口實現跨設備啟動FA
                       startAbility(intent);
                   }
               }
           });
       }
   };
   };
};
  • 為啟動和關閉 PA 定義回調,實現啟動和關閉 PA 的能力。

對于 PA 的啟動、關閉、連接等操作都需要開發者提供目標設備的 deviceId。開發者可以通過 DeviceManager 相關接口得到當前組網下的設備列表,并以彈窗的形式供用戶選擇,也可以按照實際需要實現其他個性化的處理方式。在點擊事件回調函數中,需要開發者指定得到 deviceId 后的處理邏輯,即實現類似上例中 listener.onSelectResult(String deviceId) 的方法,代碼示例如下:

// 啟動遠程 PA
   private ClickedListener mStartRemotePAListener = new ClickedListener() {
       @Override
       public void onClick(Component arg0) {
           // 啟動遠程PA
           scheduleRemoteAbility(new ISelectResult() {
               @Override
               void onSelectResult(String deviceId) {
                   if (deviceId != null) {
                       Intent intentToStartPA = new Intent();
                       // bundleName和abilityName與待啟動PA對應
                       // 例如:bundleName = "com.huawei.helloworld"
                       //       abilityName = "com.huawei.helloworld.SampleParticleAbility"
                       Operation operation = new Intent.OperationBuilder()
                               .withDeviceId(deviceId)
                               .withBundleName(bundleName)
                               .withAbilityName(abilityName)
                               .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
                               .build();
                       intentToStartPA.setOperation(operation);
                       startAbility(intentToStartPA);
                   }
               }
           });
       }
   };
    
   // 關閉遠程 PA,和啟動類似開發者需要指定待關閉 PA 對應的 bundleName 和 abilityName
   private ClickedListener mStopRemotePAListener = new ClickedListener() {
       @Override
       public void onClick(Component arg0) {
           scheduleRemoteAbility(new ISelectResult() {
               @Override
               void onSelectResult(String deviceId) {
                   if (deviceId != null) {
                       Intent intentToStopPA = new Intent();
                       // bundleName和abilityName與待關閉PA對應
                       // 例如:bundleName = "com.huawei.helloworld"
                       //       abilityName = "com.huawei.helloworld.SampleParticleAbility"
                       Operation operation = new Intent.OperationBuilder()
                               .withDeviceId(deviceId)
                               .withBundleName(bundleName)
                               .withAbilityName(abilityName)
                               .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
                               .build();
                       intentToStopPA.setOperation(operation);
                       stopAbility(intentToStopPA);
                   }
               }
           });
       }
   };
   };
};

說明

啟動和關閉的行為類似,開發者只需在 Intent 中指定待調度 PA 的 deviceId、bundleName 和 abilityName,并以 operation 的形式封裝到 Intent 內。通過 AbilitySlice(Ability)包含的 startAbility()和 stopAbility()接口即可實現相應功能。

  • 設備 A 連接設備 B 側的 PA,利用連接關系調用該 PA 執行特定任務,以及斷開連接。
// 當連接完成時,用來提供管理已連接 PA 的能力
   private MyRemoteProxy mProxy = null;
   // 用于管理連接關系
   private IAbilityConnection conn = new IAbilityConnection() {
       @Override
       public void onAbilityConnectDone(ElementName element, IRemoteObject remote, int resultCode) {
           // 跨設備PA連接完成后,會返回一個序列化的IRemoteObject對象
           // 通過該對象得到控制遠端服務的代理
           mProxy = new MyRemoteProxy(remote);
           btnConnectRemotePA.setText("connectRemoteAbility done");
        }
    
       @Override
       public void onAbilityDisconnectDone(ElementName element, int resultCode) {
           // 當已連接的遠端PA關閉時,會觸發該回調
           // 支持開發者按照返回的錯誤信息進行PA生命周期管理
           disconnectAbility(conn);
       }
   };
   };
};

僅通過啟動/關閉兩種方式對 PA 進行調度無法應對需長期交互的場景,因此,分布式任務調度平臺向開發者提供了跨設備PA連接及斷開連接的能力。為了對已連接 PA 進行管理,開發者需要實現一個滿足 IAbilityConnection 接口的連接狀態檢測實例,通過該實例可以對連接及斷開連接完成時設置具體的處理邏輯,例如:獲取控制對端 PA 的代理等。進一步為了使用該代理跨設備調度 PA,開發者需要在本地及對端分別實現對外接口一致的代理。一個具備加法能力的代理示例如下:

// 以連接提供加法計算能力的 PA 為例。為了提供跨設備連接能力,需要在本地發起連接側和對端被連接側分別實現代理。
   // 發起連接側的代理示例如下
   public class MyRemoteProxy implements IRemoteBroker{
       private static final int ERR_OK = 0;
       private static final int COMMAND_PLUS = IRemoteObject.MIN_TRANSACTION_ID;
       private final IRemoteObject remote;
    
       public MyRemoteProxy(
           /* [in] */ IRemoteObject remote) {
           this.remote = remote;
       }
    
       @Override
       public IRemoteObject asObject() {
           return remote;
       }
    
       public int plus(
           /* [in] */ int a,
           /* [in] */ int b) throws RemoteException {
           MessageParcel data = MessageParcel.obtain();
           MessageParcel reply = MessageParcel.obtain();
           // option不同的取值,決定采用同步或異步方式跨設備控制PA
           // 本例需要同步獲取對端PA執行加法的結果,因此采用同步的方式,即MessageOption.TF_SYNC
           // 具體MessageOption的設置,可參考相關API文檔
           MessageOption option = new MessageOption(MessageOption.TF_SYNC);
           data.writeInt(a);
           data.writeInt(b);
    
           try {
               remote.sendRequest(COMMAND_PLUS, data, reply, option);
               int ec = reply.readInt();
               if (ec != ERR_OK) {
                   throw new RemoteException();
               }
               int result = reply.readInt();
               return result;
           } catch (RemoteException e) {
               throw new RemoteException();
           } finally {
               data.reclaim();
               reply.reclaim();
           }
       }
   }
   }
}

此外,對端待連接的 PA 需要實現對應的客戶端,代碼示例如下所示:

// 以計算加法為例,對端實現的客戶端如下
   public class MyRemote extends RemoteObject implements IRemoteBroker{
       private static final int ERR_OK = 0;
       private static final int ERROR = -1;
       private static final int COMMAND_PLUS = IRemoteObject.MIN_TRANSACTION_ID;
    
       public MyRemote() {
           super("MyService_Remote");
       }
    
       @Override
       public IRemoteObject asObject() {
           return this;
       }
    
       @Override
       public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) {
           if (code != COMMAND_PLUS) {
               reply.writeInt(ERROR);
               return false;
           }
           int value1 = data.readInt();
           int value2 = data.readInt();
           int sum = value1 + value2;
           reply.writeInt(ERR_OK);
           reply.writeInt(sum);
           return true;
       }
   }
   }
}

對端除了要實現如上所述的客戶端外,待連接的 PA 還需要作如下修改:

// 為了返回給連接方可調用的代理,需要在該 PA 中實例化客戶端,例如作為該 PA 的成員變量
   private MyProxy remote = new MyProxy();
   // 當該 PA 接收到連接請求時,即將該客戶端轉化為代理返回給連接發起側
   @Override
   protected IRemoteObject onConnect(Intent intent) {
       super.onConnect(intent);
       return remote.asObject();
   }
   }
}

完成上述步驟后,可以通過點擊事件實現連接、利用連接關系控制 PA 以及斷開連接等行為,代碼示例如下:

// 連接遠程PA
   private ClickedListener mConnectRemotePAListener = new ClickedListener() {
       @Override
       public void onClick(Component arg0) {
           scheduleRemoteAbility(new ISelectResult() {
               @Override
               void onSelectResult(String deviceId) {
                   if (deviceId != null) {
                       Intent connectPAIntent = new Intent();
                       // bundleName和abilityName與待連接的PA一一對應
                       // 例如:bundleName = "com.huawei.helloworld"
                       //       abilityName = "com.huawei.helloworld.SampleParticleAbility"
                       Operation operation = new Intent.OperationBuilder()
                               .withDeviceId(deviceId)
                               .withBundleName(bundleName)
                               .withAbilityName(abilityName)
                               .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
                               .build();
                       connectPAIntent.setOperation(operation);
                       connectAbility(connectPAIntent, conn);
                   }
               }
           });
       }
   };
   // 控制已連接PA執行加法
   private ClickedListener mControlPAListener = new ClickedListener() {
       @Override
       public void onClick(Component arg0) {
           if (mProxy != null) {
               int ret = -1;
               try {
                   ret = mProxy.plus(10, 20);
               } catch (RemoteException e) {
                   e.printStackTrace();
               }
               btnControlRemotePA.setText("ControlRemotePA result = " + ret);
           }
       }
   };
   // 與遠程PA斷開連接
   private ClickedListener mDisconnectRemotePAListener = new ClickedListener() {
       @Override
       public void onClick(Component arg0) {
           // 按鈕復位
           btnConnectRemotePA.setText("ConnectRemotePA");
           btnControlRemotePA.setText("ControlRemotePA");
           disconnectAbility(conn);
       }
   };
   };
};

說明

通過連接/斷開連接遠程 PA,與跨設備 PA 建立長期的管理關系。例如在本例中,通過連接關系得到遠程 PA 的控制代理后,實現跨設備計算加法并將結果返回到本地顯示。在實際開發中,開發者可以根據需要實現多種分布式場景,例如:跨設備位置/電量等信息的采集、跨設備計算資源互助等。

  • 設備 A 將運行時的 FA 遷移到設備 B,實現業務在設備間無縫遷移。
// 跨設備遷移FA
   // 本地FA設置當前運行任務
   private ClickedListener mContinueAbilityListener = new ClickedListener() {
       @Override
       public void onClick(Component arg0) {
           // 用戶選擇設備后實現業務遷移
           scheduleRemoteAbility(new ISelectResult() {
               @Override
               public void onSelectResult(String deviceId) {
                   continueAbility(deviceId);
               }
           });
       }
   };
   };
};

此外,不同于啟動行為,FA 的遷移還涉及到狀態數據的傳遞。為此,繼承的 IAbilityContinuation 接口為開發者提供遷移過程中特定事件的管理能力。通過自定義遷移事件相關的行為,最終實現對 Ability 的遷移。具體的定義可以參考相關的 API 文檔,此處主要以較為常用的兩個事件,包括遷移發起端完成遷移的回調 onCompleteContinuation(int result)以及接收到遠端遷移行為傳遞數據的回調 onRestoreData(IntentParams restoreData)。其他還包括遷移到遠端設備的 FA 關閉的回調 onRemoteTerminated()、用于本地遷移發起時保存狀態數據的回調 onSaveData(IntentParams saveData)和本地發起遷移的回調 onStartContinuation()。按照實際應用自定義特定場景對應的回調,可以完成多種場景下 FA 的遷移任務。

@Override
   public boolean onSaveData(IntentParams saveData) {
       String exampleData = String.valueOf(System.currentTimeMillis());
       saveData.setParam("continueParam", exampleData);
       return true;
   }
    
   @Override
   public boolean onRestoreData(IntentParams restoreData) {
       // 遠端FA遷移傳來的狀態數據,開發者可以按照特定的場景對這些數據進行處理
       Object data = restoreData.getParam("continueParam");
       return true;
   }
    
   @Override
   public void onCompleteContinuation(int result) {
       btnContinueRemoteFA.setText("ContinueAbility Done");
   }
   }
}

說明

1.FA 遷移可以打通設備間的壁壘,有助于不同能力的設備進行互助。前文以一個簡單的例子介紹如何通過分布式任務調度提供的能力,實現 FA 跨設備的遷移(包括 FA 啟動及狀態數據的同步)。 2.FA 遷移過程中,遠端 FA 首先接收到發起端 FA 傳輸的數據,再執行啟動,即 onRestoreData() 發生在 onStart() 之前。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 分布式
    +關注

    關注

    1

    文章

    925

    瀏覽量

    74617
  • 鴻蒙
    +關注

    關注

    57

    文章

    2393

    瀏覽量

    43075
  • OpenHarmony
    +關注

    關注

    25

    文章

    3749

    瀏覽量

    16610
收藏 人收藏

    評論

    相關推薦

    分布式云化數據庫有哪些類型

    分布式云化數據庫有哪些類型?分布式云化數據庫主要類型包括:關系型分布式數據庫、非關系型分布式數據庫、新SQL分布式數據庫、以列方式存儲數據、
    的頭像 發表于 01-15 09:43 ?113次閱讀

    HarmonyOS Next 應用元服務開發-分布式數據對象遷移數據文件資產遷移

    設備文件訪問實現文件的遷移,難以獲取文件同步完成的時間。為了保證更高的成功率,文件的遷移不建議繼續通過該方式實現,推薦使用分布式數據對象攜帶資產的方式。開發者此前通過跨設備文件訪問實現的文件遷移依然生效
    發表于 12-24 10:11

    HarmonyOS Next 應用元服務開發-分布式數據對象遷移數據權限與基礎數據

    設備文件訪問實現文件的遷移,難以獲取文件同步完成的時間。為了保證更高的成功率,文件的遷移不建議繼續通過該方式實現,推薦使用分布式數據對象攜帶資產的方式。開發者此前通過跨設備文件訪問實現的文件遷移依然生效
    發表于 12-24 09:40

    分布式光纖測溫解決方案

    分布式光纖測溫解決方案
    的頭像 發表于 11-12 01:02 ?230次閱讀
    <b class='flag-5'>分布式</b>光纖測溫解決方案

    鴻蒙開發管理:ohos.account.distributedAccount 分布式帳號管理

    獲取分布式帳號單實例對象。
    的頭像 發表于 07-08 10:03 ?310次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>管理:ohos.account.distributedAccount <b class='flag-5'>分布式</b>帳號管理

    鴻蒙ArkTS聲明開發:跨平臺支持列表【分布式遷移標識】 通用屬性

    組件的分布式遷移標識,指明了該組件在分布式遷移場景下可以將特定狀態恢復到對端設備。
    的頭像 發表于 06-07 21:15 ?448次閱讀

    鴻蒙開發接口數據管理:【@ohos.data.distributedData (分布式數據管理)】

    分布式數據管理為應用程序提供不同設備間數據庫的分布式協同能力。通過調用分布式數據各個接口,應用程序可將數據保存到分布式數據庫中,并可對分布式
    的頭像 發表于 06-07 09:30 ?1077次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>接口數據管理:【@ohos.data.distributedData (<b class='flag-5'>分布式</b>數據管理)】

    鴻蒙開發接口資源調度:【@ohos.workScheduler (延遲任務調度)】

    開發者在開發應用時,通過調用延遲任務注冊接口,注冊對實時性要求不高的延遲任務,該任務默認由系統安排,在系統空閑時根據性能、功耗、熱等情況進行
    的頭像 發表于 06-04 10:01 ?1017次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>接口資源<b class='flag-5'>調度</b>:【@ohos.workScheduler (延遲<b class='flag-5'>任務</b><b class='flag-5'>調度</b>)】

    HarmonyOS開發實例:【分布式數據服務】

    分布式數據服務(Distributed Data Service,DDS)為應用程序提供不同設備間數據分布式的能力。
    的頭像 發表于 04-18 10:18 ?799次閱讀
    HarmonyOS<b class='flag-5'>開發</b>實例:【<b class='flag-5'>分布式</b>數據服務】

    HarmonyOS開發實例:【分布式新聞客戶端】

    基于柵格布局、設備管理和多端協同,實現一次開發,多端部署的分布式新聞客戶端頁面。
    的頭像 發表于 04-17 15:57 ?936次閱讀
    HarmonyOS<b class='flag-5'>開發</b>實例:【<b class='flag-5'>分布式</b>新聞客戶端】

    HarmonyOS開發實例:【分布式郵件】

    基于TS擴展的聲明開發范式編程語言編寫的一個分布式郵件系統,可以由一臺設備拉起另一臺設備,每次改動郵件內容,都會同步更新兩臺設備的信息
    的頭像 發表于 04-17 10:29 ?811次閱讀
    HarmonyOS<b class='flag-5'>開發</b>實例:【<b class='flag-5'>分布式</b>郵件】

    OpenHarmony南向開發案例:【分布式畫板】

    使用OpenHarmony3.1-Release開發的應用。通過OpenHarmony的分布式技術,使多人能夠一起畫畫。
    的頭像 發表于 04-12 14:40 ?1103次閱讀
    OpenHarmony南向<b class='flag-5'>開發</b>案例:【<b class='flag-5'>分布式</b>畫板】

    鴻蒙HarmonyOS開發實例:【分布式關系型數據庫】

    使用[@ohos.data.relationalStore]接口和[@ohos.distributedDeviceManager]?接口展示了在eTS中分布式關系型數據庫的使用,在增、刪、改、查的基本操作外,還包括分布式數據庫的數據同步同能。
    的頭像 發表于 04-11 09:52 ?1031次閱讀
    <b class='flag-5'>鴻蒙</b>HarmonyOS<b class='flag-5'>開發</b>實例:【<b class='flag-5'>分布式</b>關系型數據庫】

    鴻蒙HarmonyOS開發實戰:【分布式音樂播放】

    本示例使用fileIo獲取指定音頻文件,并通過AudioPlayer完成了音樂的播放完成了基本的音樂播放、暫停、上一曲、下一曲功能;并使用DeviceManager完成了分布式設備列表的顯示和分布式能力完成了音樂播放狀態的跨設備分享。
    的頭像 發表于 04-10 17:51 ?947次閱讀
    <b class='flag-5'>鴻蒙</b>HarmonyOS<b class='flag-5'>開發</b>實戰:【<b class='flag-5'>分布式</b>音樂播放】

    HarmonyOS開發技術全面分析

    以應用遷移為例,簡要地展示了分布式任務調度能力。 圖4: 分布式任務調度示意圖 一次
    發表于 02-21 16:31
    主站蜘蛛池模板: 四虎精品影院在线观看视频 | 538porm在线看国产亚洲 | 欧美视频小说 | 欧美性色生活片天天看99 | 九月色婷婷| 亚洲大成色www永久网 | 1024手机在线看永久免费 | 精品国产一区二区三区成人 | 免费观看在线视频 | 色播欧美| 手机看片中文字幕 | 狼人久草| 午夜精品福利在线观看 | 国产成人综合自拍 | 综合成人在线 | 女人张开腿让男人桶视频免费大全 | 四虎永久免费在线 | 国产午夜精品一区二区理论影院 | 性欧美丨18一19 | 久久免费精品 | 被男同桌摸内裤好爽视频 | 女18poren69| 欧美激情91 | 永井玛丽亚中文在线观看视频 | 亚欧美视频 | 亚洲综合天堂网 | 日本xxxxxxxx69 | a一级视频 | 久久夜色精品国产噜噜小说 | 国产大片免费观看资源 | 91精品福利久久久 | 国模小丫大尺度啪啪人体 | 在线视频亚洲 | 激情五月激情综合 | 日本a级三级三级三级久久 日本a级影院 | 国产网站在线免费观看 | 国产精品亚洲一区二区三区在线播放 | 91啪免费网站在线观看 | 天天干天天干 | 桃花岛亚洲精品tv自拍网站 | 日夜操在线视频 |