日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HarmonyOS之分布式任务调度开发流程

發(fā)布時間:2024/5/21 编程问答 81 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HarmonyOS之分布式任务调度开发流程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、概述

① 分布式任務調度
  • 在 HarmonyOS 中,分布式任務調度平臺對搭載 HarmonyOS 的多設備構筑的“超級虛擬終端”提供統(tǒng)一的組件管理能力,為應用定義統(tǒng)一的能力基線、接口形式、數(shù)據(jù)結構、服務描述語言,屏蔽硬件差異;支持遠程啟動、遠程調用、業(yè)務無縫遷移等分布式任務。
  • 分布式任務調度平臺在底層實現(xiàn) Ability(分布式任務調度的基本組件)跨設備的啟動/關閉、連接及斷開連接以及遷移等能力,實現(xiàn)跨設備的組件管理:
    • 啟動和關閉:向開發(fā)者提供管理遠程 Ability 的能力,即支持啟動 Page 模板的 Ability,以及啟動、關閉 Service 和 Data 模板的 Ability。
    • 連接和斷開連接:向開發(fā)者提供跨設備控制服務(Service 和 Data 模板的 Ability)的能力,開發(fā)者可以通過與遠程服務連接及斷開連接實現(xiàn)獲取或注銷跨設備管理服務的對象,達到和本地一致的服務調度。
    • 遷移能力:向開發(fā)者提供跨設備業(yè)務的無縫遷移能力,開發(fā)者可以通過調用 Page 模板 Ability 的遷移接口,將本地業(yè)務無縫遷移到指定設備中,打通設備間壁壘。
② 約束與限制
  • 開發(fā)者需要在 Intent 中設置支持分布式的標記(例如: Intent.FLAG_ABILITYSLICE_MULTI_DEVICE 表示該應用支持分布式調度),否則將無法獲得分布式能力。
  • 開發(fā)者通過在 config.json 中的 reqPermissions 字段里添加多設備協(xié)同訪問的權限申請:三方應用使用{“name”: “ohos.permission.DISTRIBUTED_DATASYNC”}。
  • PA(Particle Ability,Service 和 Data 模板的 Ability)的調用支持連接及斷開連接、啟動及關閉這四類行為,在進行調度時:
    • 開發(fā)者必須在 Intent 中指定 PA 對應的 bundleName 和 abilityName。
    • 當開發(fā)者需要跨設備啟動、關閉或連接 PA 時,需要在 Intent 中指定對端設備的 deviceId。開發(fā)者可通過如設備管理類 DeviceManager 提供的 getDeviceList 獲取指定條件下匿名化處理的設備列表,實現(xiàn)對指定設備 PA 的啟動/關閉以及連接管理。
  • FA(Feature Ability,Page 模板的 Ability)的調用支持啟動和遷移行為,在進行調度時:
    • 當啟動 FA 時,需要開發(fā)者在 Intent 中指定對端設備的 deviceId、bundleName 和 abilityName。
    • FA 的遷移實現(xiàn)相同 bundleName 和 abilityName 的 FA 跨設備遷移,因此需要指定遷移設備的 deviceId。
  • DevEco Studio 遠程模擬設備的功能無法調測分布式任務調度,需要在真機環(huán)境下進行測試。

二、場景介紹

  • 開發(fā)者在應用中集成分布式調度能力,通過調用指定能力的分布式接口,實現(xiàn)跨設備能力調度。根據(jù) Ability 模板及意圖的不同,分布式任務調度向開發(fā)者提供以下六種能力:啟動遠程 FA、啟動遠程 PA、關閉遠程 PA、連接遠程 PA、斷開連接遠程 PA 和 FA 跨設備遷移。
  • 下面以設備 A(本地設備)和設備 B(遠端設備)為例,進行場景介紹:
    • 設備 A 啟動設備 B 的 FA:在設備 A 上通過本地應用提供的啟動按鈕,啟動設備 B 上對應的 FA。例如:設備 A 控制設備 B 打開相冊,只需開發(fā)者在啟動 FA 時指定打開相冊的意圖即可。
    • 設備 A 啟動設備 B 的 PA:在設備 A 上通過本地應用提供的啟動按鈕,啟動設備 B 上指定的 PA。例如:開發(fā)者在啟動遠程服務時通過意圖指定音樂播放服務,即可實現(xiàn)設備 A 啟動設備 B 音樂播放的能力。
    • 設備 A 關閉設備 B 的 PA:在設備 A 上通過本地應用提供的關閉按鈕,關閉設備 B 上指定的 PA。類似啟動的過程,開發(fā)者在關閉遠程服務時通過意圖指定音樂播放服務,即可實現(xiàn)關閉設備 B 上該服務的能力。
    • 設備 A 連接設備 B 的 PA:在設備 A 上通過本地應用提供的連接按鈕,連接設備 B 上指定的 PA。連接后,通過其他功能相關按鈕實現(xiàn)控制對端 PA 的能力。通過連接關系,開發(fā)者可以實現(xiàn)跨設備的同步服務調度,實現(xiàn)如大型計算任務互助等價值場景。
    • 設備 A 與設備 B 的 PA 斷開連接:在設備 A 上通過本地應用提供斷開連接的按鈕,將之前已連接的 PA 斷開連接。
    • 設備 A 的 FA 遷移至設備 B:設備 A 上通過本地應用提供的遷移按鈕,將設備 A 的業(yè)務無縫遷移到設備 B 中。通過業(yè)務遷移能力,打通設備 A 和設備 B 間的壁壘,實現(xiàn)如文檔跨設備編輯、視頻從客廳到房間跨設備接續(xù)播放等場景。

三、API 說明

  • 分布式調度平臺提供的連接和斷開連接 PA、啟動遠程 FA、啟動和關閉 PA 以及遷移 FA 的能力,是實現(xiàn)更多價值性場景的基礎。
① 連接遠程 PA
  • connectAbility(Intent intent, IAbilityConnection conn)接口提供連接指定設備上 PA 的能力,Intent 中指定待連接 PA 的設備 deviceId、bundleName 和 abilityName。
  • 當連接成功后,通過在 conn 定義的 onAbilityConnectDone 回調中獲取對端 PA 的服務代理,兩者的連接關系則由 conn 維護。具體的參數(shù)定義如下表所示:
參數(shù)名類型說明
intentohos.aafwk.content.Intent開發(fā)者需在intent對應的Operation中指定待連接PA的設備deviceId、bundleName和abilityName
connohos.aafwk.ability.IAbilityConnection當連接成功或失敗時,作為連接關系的回調接口。該接口提供連接完成和斷開連接完成時的處理邏輯,開發(fā)者可根據(jù)具體的場景進行定義
② 啟動遠程 FA/PA
  • startAbility(Intent intent)接口提供啟動指定設備上 FA 和 PA 的能力,Intent 中指定待啟動 FA/PA 的設備 deviceId、bundleName 和 abilityName。
  • 具體參數(shù)定義如下表所示:
參數(shù)名類型說明
intentohos.aafwk.content.Intent當開發(fā)者需要調用該接口啟動遠程PA時,需要指定待啟動PA的設備deviceId、bundleName和abilityName。若不指定設備deviceId,則無法跨設備調用PA。類似地,在啟動FA時,也需要開發(fā)者指定啟動FA的設備deviceId、bundleName和abilityName
  • 分布式調度平臺還會提供與上述功能相對應的斷開遠程 PA 的連接和關閉遠程 PA 的接口,相關的參數(shù)與連接、啟動的接口類似。
    • 斷開遠程 PA 連接:disconnectAbility?(IAbilityConnection conn)。
    • 關閉遠程 PA:stopAbility?(Intent intent)。
③ 遷移 FA
  • continueAbility(String deviceId) 接口提供將本地FA遷移到指定設備上的能力,需要開發(fā)者在調用時指定目標設備的 deviceId。具體參數(shù)定義如下表所示:
參數(shù)名類型說明
deviceIdString當開發(fā)者需要調用該接口將本地FA遷移時,需要指定目標設備的deviceId
  • Ability 和 AbilitySlice 類均需要實現(xiàn) IAbilityContinuation 及其方法,才可以實現(xiàn) FA 遷移。

四、開發(fā)流程

  • 導入功能依賴的包:
// 以下依賴包含分布式調度平臺開放的接口// 用于:連接/斷開連接遠程PA、啟動遠程FA、通過連接關系實現(xiàn)對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;// 為了實現(xiàn)遷移能力,需要引入傳遞遷移所需數(shù)據(jù)的包以及實現(xiàn)遷移能力的接口import ohos.aafwk.ability.IAbilityContinuation;import ohos.aafwk.content.IntentParams;// 為了實現(xiàn)跨設備指令及數(shù)據(jù)通信,需要使用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;//(可選)多設備場景下涉及設備選擇,為此需要引入組網(wǎng)設備發(fā)現(xiàn)的能力import ohos.distributedschedule.interwork.DeviceInfo;import ohos.distributedschedule.interwork.DeviceManager;// (可選)設計界面相關的包函數(shù),對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;
  • 編寫一個基本的 FA 用于使用分布式能力:
// 調用AbilitySlice模板實現(xiàn)一個用于控制基礎功能的FA,AbilitySlice的代碼示例如下:public class SampleSlice extends AbilitySlice {@Overridepublic void onStart(Intent intent) {super.onStart(intent);// 開發(fā)者可以自行進行界面設計// 為按鈕設置統(tǒng)一的背景色// 例如通過PositionLayout可以實現(xiàn)簡單界面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);}@Overridepublic void onInactive() {super.onInactive();}@Overridepublic void onActive() {super.onActive();}@Overridepublic void onBackground() {super.onBackground();}@Overridepublic void onForeground(Intent intent) {super.onForeground(intent);}@Overridepublic void onStop() {super.onStop();}}
  • 使用分布式能力要求開發(fā)者在 Ability 對應的 config.json 中聲明多設備協(xié)同訪問的權限:三方應用使用{“name”: “ohos.permission.DISTRIBUTED_DATASYNC”}。一個三方應用部署的示例如下:
{"module": {"reqPermissions": [{"name": "ohos.permission.DISTRIBUTED_DATASYNC"},{...}]}}
  • 對于三方應用還要求在實現(xiàn) Ability 的代碼中顯式聲明需要使用的權限,如下所示:
public class SampleSlice extends AbilitySlice {@Overridepublic void onStart(Intent intent) {// 開發(fā)者顯示聲明需要使用的權限requestPermissionsFromUser(new String[]{"ohos.permission.DISTRIBUTED_DATASYNC"}, 0);super.onStart(intent); }}
  • 為不同的能力設置相應的控制按鈕:
// 建議開發(fā)者按照自己的界面進行按鈕設計// 開發(fā)者可以自行實現(xiàn)如下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);}
  • 通過設備管理 DeviceManager 提供的 getDeviceList 接口獲取設備列表,用于指定目標設備:
// ISelectResult是一個自定義接口,用來處理指定設備deviceId后執(zhí)行的行為interface ISelectResult {void onSelectResult(String deviceId);}// 獲得設備列表,開發(fā)者可在得到的在線設備列表中選擇目標設備執(zhí)行操作private void scheduleRemoteAbility(ISelectResult listener) {// 調用DeviceManager的getDeviceList接口,通過FLAG_GET_ONLINE_DEVICE標記獲得在線設備列表List<DeviceInfo> onlineDevices = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);// 判斷組網(wǎng)設備是否為空if (onlineDevices.isEmpty()) {listener.onSelectResult(null);return;}int numDevices = onlineDevices.size();List<String> deviceIds = new ArrayList<>(numDevices);onlineDevices.forEach((device) -> {deviceIds.add(device.getDeviceId());});// 以選擇首個設備作為目標設備為例// 開發(fā)者也可按照具體場景,通過別的方式進行設備選擇String selectDeviceId = deviceIds.get(0);listener.onSelectResult(selectDeviceId); }
  • 上述實例中涉及對在線組網(wǎng)設備的查詢,該項能力需要開發(fā)者在對應的 config.json 中聲明獲取設備列表及設備信息的權限,如下所示:
{"reqPermissions": [{"name": "ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"}, {"name": "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"}, {"name": "ohos.permission.GET_BUNDLE_INFO"}]}
  • 為啟動遠程 FA 的按鈕設置點擊回調,實現(xiàn)啟動遠程 FA 的能力:
// 啟動一個指定bundleName和abilityName的FAprivate ClickedListener mStartRemoteFAListener = new ClickedListener() {@Overridepublic void onClick(Component arg0) {// 啟動遠程PAscheduleRemoteAbility(new ISelectResult() {@Overridevoid onSelectResult(String deviceId) {if (deviceId != null) {// 通過scheduleRemoteAbility指定目標設備deviceId// 指定待啟動FA的bundleName和abilityName// 例如:bundleName = "com.helloworld"// abilityName = "com.helloworld.SampleFeatureAbility"// 設置分布式標記,表明當前涉及分布式能力Operation operation = new Intent.OperationBuilder().withDeviceId(deviceId).withBundleName(bundleName).withAbilityName(abilityName).withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE).build();Intent intent = new Intent();intent.setOperation(operation);// 通過AbilitySlice包含的startAbility接口實現(xiàn)跨設備啟動FAstartAbility(intent);}}});}};
  • 為啟動和關閉 PA 定義回調,實現(xiàn)啟動和關閉 PA 的能力。
    • 對于 PA 的啟動、關閉、連接等操作都需要開發(fā)者提供目標設備的 deviceId。開發(fā)者可以通過 DeviceManager 相關接口得到當前組網(wǎng)下的設備列表,并以彈窗的形式供用戶選擇,也可以按照實際需要實現(xiàn)其他個性化的處理方式。
    • 在點擊事件回調函數(shù)中,需要開發(fā)者指定得到 deviceId 后的處理邏輯,即實現(xiàn)類似上例中 listener.onSelectResult(String deviceId) 的方法,代碼示例如下:
// 啟動遠程PAprivate ClickedListener mStartRemotePAListener = new ClickedListener() {@Overridepublic void onClick(Component arg0) {// 啟動遠程PAscheduleRemoteAbility(new ISelectResult() {@Overridevoid onSelectResult(String deviceId) {if (deviceId != null) {// bundleName和abilityName與待啟動PA對應// 例如:bundleName = "com.helloworld"// abilityName = "com.helloworld.SampleParticleAbility"Operation operation = new Intent.OperationBuilder().withDeviceId(deviceId).withBundleName(bundleName).withAbilityName(abilityName).withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE).build();Intent intentToStartPA = new Intent();intentToStartPA.setOperation(operation);startAbility(intentToStartPA);}}});}};// 關閉遠程PA,和啟動類似開發(fā)者需要指定待關閉PA對應的bundleName和abilityNameprivate ClickedListener mStopRemotePAListener = new ClickedListener() {@Overridepublic void onClick(Component arg0) {scheduleRemoteAbility(new ISelectResult() {@Overridevoid onSelectResult(String deviceId) {if (deviceId != null) {// bundleName和abilityName與待關閉PA對應// 例如:bundleName = "com.helloworld"// abilityName = "com.helloworld.SampleParticleAbility"Operation operation = new Intent.OperationBuilder().withDeviceId(deviceId).withBundleName(bundleName).withAbilityName(abilityName).withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE).build();Intent intentToStopPA = new Intent();intentToStopPA.setOperation(operation);stopAbility(intentToStopPA);}}});}};
    • 啟動和關閉的行為類似,只需在 Intent 中指定待調度 PA 的 deviceId、bundleName 和 abilityName,并以 operation 的形式封裝到 Intent 內。通過AbilitySlice(Ability)包含的 startAbility() 和 stopAbility() 接口即可實現(xiàn)相應功能。
  • 設備 A 連接設備 B 側的 PA,利用連接關系調用該 PA 執(zhí)行特定任務,以及斷開連接:
// 當連接完成時,用來提供管理已連接PA的能力private MyRemoteProxy mProxy = null;// 用于管理連接關系private IAbilityConnection mConn = new IAbilityConnection() {@Overridepublic void onAbilityConnectDone(ElementName element, IRemoteObject remote, int resultCode) {// 跨設備PA連接完成后,會返回一個序列化的IRemoteObject對象// 通過該對象得到控制遠端服務的代理mProxy = new MyRemoteProxy(remote);btnConnectRemotePA.setText("connectRemoteAbility done");}@Overridepublic void onAbilityDisconnectDone(ElementName element, int resultCode) {// 當已連接的遠端PA關閉時,會觸發(fā)該回調// 支持開發(fā)者按照返回的錯誤信息進行PA生命周期管理disconnectAbility(mConn);}};
  • 僅通過啟動/關閉兩種方式對 PA 進行調度無法應對需長期交互的場景,因此,分布式任務調度平臺向開發(fā)者提供了跨設備 PA 連接及斷開連接的能力。
  • 為了對已連接 PA 進行管理,開發(fā)者需要實現(xiàn)一個滿足 IAbilityConnection 接口的連接狀態(tài)檢測實例,通過該實例可以對連接及斷開連接完成時設置具體的處理邏輯,例如:獲取控制對端PA的代理等。進一步為了使用該代理跨設備調度 PA,開發(fā)者需要在本地及對端分別實現(xiàn)對外接口一致的代理。一個具備加法能力的代理示例如下:
// 以連接提供加法計算能力的PA為例。為了提供跨設備連接能力,需要在本地發(fā)起連接側和對端被連接側分別實現(xiàn)代理// 發(fā)起連接側的代理示例如下: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(IRemoteObject remote) {this.remote = remote;}@Overridepublic IRemoteObject asObject() {return remote;}public int plus(int a, int b) throws RemoteException {MessageParcel data = MessageParcel.obtain();MessageParcel reply = MessageParcel.obtain();// option不同的取值,決定采用同步或異步方式跨設備控制PA// 本例需要同步獲取對端PA執(zhí)行加法的結果,因此采用同步的方式,即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 errCode = reply.readInt();if (errCode != ERR_OK) {throw new RemoteException();}int result = reply.readInt();return result;}finally {data.reclaim();reply.reclaim();}}}
  • 此外,對端待連接的PA需要實現(xiàn)對應的客戶端,代碼示例如下所示:
// 以計算加法為例,對端實現(xiàn)的客戶端如下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");}@Overridepublic IRemoteObject asObject() {return this;}@Overridepublic 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;}}
  • 對端除了要實現(xiàn)如上所述的客戶端外,待連接的 PA 還需要作如下修改:
// 為了返回給連接方可調用的代理,需要在該PA中實例化客戶端,例如作為該PA的成員變量private MyRemote remote = new MyRemote();// 當該PA接收到連接請求時,即將該客戶端轉化為代理返回給連接發(fā)起側@Overrideprotected IRemoteObject onConnect(Intent intent) {super.onConnect(intent);return remote.asObject();}
  • 完成上述步驟后,可以通過點擊事件實現(xiàn)連接、利用連接關系控制 PA 以及斷開連接等行為,代碼示例如下:
// 連接遠程PAprivate ClickedListener mConnectRemotePAListener = new ClickedListener() {@Overridepublic void onClick(Component arg0) {scheduleRemoteAbility(new ISelectResult() {@Overridevoid onSelectResult(String deviceId) {if (deviceId != null) {Intent connectPAIntent = new Intent();// bundleName和abilityName與待連接的PA一一對應// 例如:bundleName = "com.helloworld"// abilityName = "com.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, mConn);}}});}};// 控制已連接PA執(zhí)行加法private ClickedListener mControlPAListener = new ClickedListener() {@Overridepublic void onClick(Component arg0) {if (mProxy != null) {int ret = -1;try {ret = mProxy.plus(10, 20);} catch (RemoteException e) {HiLog.error(LABEL, "ControlRemotePA error");}btnControlRemotePA.setText("ControlRemotePA result = " + ret);}}};// 與遠程PA斷開連接private ClickedListener mDisconnectRemotePAListener = new ClickedListener() {@Overridepublic void onClick(Component arg0) {// 按鈕復位btnConnectRemotePA.setText("ConnectRemotePA");btnControlRemotePA.setText("ControlRemotePA");disconnectAbility(mConn);}};
  • 設備 A 將運行時的 FA 遷移到設備 B,實現(xiàn)業(yè)務在設備間無縫遷移:
// 跨設備遷移FA// 本地FA設置當前運行任務private ClickedListener mContinueAbilityListener = new ClickedListener() {@Overridepublic void onClick(Component arg0) {// 用戶選擇設備后實現(xiàn)業(yè)務遷移scheduleRemoteAbility(new ISelectResult() {@Overridepublic void onSelectResult(String deviceId) {continueAbility(deviceId);}});}};
  • FA 的遷移還涉及到狀態(tài)數(shù)據(jù)的傳遞,需要繼承 IAbilityContinuation 接口,供開發(fā)者實現(xiàn)遷移過程中特定事件的管理能力,代碼示例如下:
public class SampleSlice extends AbilitySlice implements IAbilityContinuation {@Overridepublic boolean onSaveData(IntentParams saveData) {String exampleData = String.valueOf(System.currentTimeMillis());saveData.setParam("continueParam", exampleData);return true;}@Overridepublic boolean onRestoreData(IntentParams restoreData) {// 遠端FA遷移傳來的狀態(tài)數(shù)據(jù),開發(fā)者可以按照特定的場景對這些數(shù)據(jù)進行處理Object data = restoreData.getParam("continueParam");return true;}@Overridepublic void onCompleteContinuation(int result) {btnContinueRemoteFA.setText("ContinueAbility Done");}}
  • 通過自定義遷移事件相關的行為,最終實現(xiàn)對 Ability 的遷移,此處主要以較為常用的兩個事件,包括遷移發(fā)起端完成遷移的回調 onCompleteContinuation(int result) 以及接收到遠端遷移行為傳遞數(shù)據(jù)的回調 onRestoreData(IntentParams restoreData)。其他還包括遷移到遠端設備的 FA 關閉的回調 onRemoteTerminated()、用于本地遷移發(fā)起時保存狀態(tài)數(shù)據(jù)的回調onSaveData(IntentParams saveData)和本地發(fā)起遷移的回調onStartContinuation()。
  • 按照實際應用自定義特定場景對應的回調,可以完成多種場景下 FA 的遷移任務。FA 遷移可以打通設備間的壁壘,有助于不同能力的設備進行互助。
  • FA 遷移過程中,遠端 FA 首先接收到發(fā)起端 FA 傳輸?shù)臄?shù)據(jù),再執(zhí)行啟動,即 onRestoreData() 發(fā)生在 onStart() 之前。

五、實例參考

  • 演示分布式任務調度的六種場景:啟動遠程FA,啟動遠程PA,關閉遠程PA,連接遠程PA,斷開連接遠程PA, 和FA跨端遷移:DistributedScheduler。

總結

以上是生活随笔為你收集整理的HarmonyOS之分布式任务调度开发流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。