生活随笔
收集整理的這篇文章主要介紹了
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ù)名類型說明 intent ohos.aafwk.content.Intent 開發(fā)者需在intent對應的Operation中指定待連接PA的設備deviceId、bundleName和abilityName conn ohos.aafwk.ability.IAbilityConnection 當連接成功或失敗時,作為連接關系的回調接口。該接口提供連接完成和斷開連接完成時的處理邏輯,開發(fā)者可根據(jù)具體的場景進行定義
② 啟動遠程 FA/PA
startAbility(Intent intent)接口提供啟動指定設備上 FA 和 PA 的能力,Intent 中指定待啟動 FA/PA 的設備 deviceId、bundleName 和 abilityName。 具體參數(shù)定義如下表所示:
參數(shù)名類型說明 intent ohos.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ù)名類型說明 deviceId String 當開發(fā)者需要調用該接口將本地FA遷移時,需要指定目標設備的deviceId
Ability 和 AbilitySlice 類均需要實現(xiàn) IAbilityContinuation 及其方法,才可以實現(xiàn) FA 遷移。
四、開發(fā)流程
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
; 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
; 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
;
public class SampleSlice extends AbilitySlice
{ @Overridepublic
void onStart ( Intent intent
) { super
. onStart ( intent
) ; 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
) { requestPermissionsFromUser ( new String
[ ] { "ohos.permission.DISTRIBUTED_DATASYNC" } , 0 ) ; super
. onStart ( intent
) ; } }
private
void addComponents ( PositionLayout linear
, ShapeElement buttonBg
, LayoutConfig config
) { btnStartRemoteFA
= createButton ( "StartRemoteFA" , buttonBg
, config
) ; btnStartRemoteFA
. setClickedListener ( mStartRemoteFAListener
) ; linear
. addComponent ( btnStartRemoteFA
) ; btnStartRemotePA
= createButton ( "StartRemotePA" , buttonBg
, config
) ; btnStartRemotePA
. setClickedListener ( mStartRemotePAListener
) ; linear
. addComponent ( btnStartRemotePA
) ; btnStopRemotePA
= createButton ( "StopRemotePA" , buttonBg
, config
) ; btnStopRemotePA
. setClickedListener ( mStopRemotePAListener
) ; linear
. addComponent ( btnStopRemotePA
) ; btnConnectRemotePA
= createButton ( "ConnectRemotePA" , buttonBg
, config
) ; btnConnectRemotePA
. setClickedListener ( mConnectRemotePAListener
) ; linear
. addComponent ( btnConnectRemotePA
) ; btnControlRemotePA
= createButton ( "ControlRemotePA" , buttonBg
, config
) ; btnControlRemotePA
. setClickedListener ( mControlPAListener
) ; linear
. addComponent ( btnControlRemotePA
) ; btnDisconnectRemotePA
= createButton ( "DisconnectRemotePA" , buttonBg
, config
) ; btnDisconnectRemotePA
. setClickedListener ( mDisconnectRemotePAListener
) ; linear
. addComponent ( btnDisconnectRemotePA
) ; btnContinueRemoteFA
= createButton ( "ContinueRemoteFA" , buttonBg
, config
) ; btnContinueRemoteFA
. setClickedListener ( mContinueAbilityListener
) ; linear
. addComponent ( btnContinueRemoteFA
) ; }
通過設備管理 DeviceManager 提供的 getDeviceList 接口獲取設備列表,用于指定目標設備:
interface ISelectResult
{ void onSelectResult ( String deviceId
) ; } private
void scheduleRemoteAbility ( ISelectResult listener
) { List
< DeviceInfo
> onlineDevices
= DeviceManager
. getDeviceList ( DeviceInfo
. FLAG_GET_ONLINE_DEVICE
) ; if ( onlineDevices
. isEmpty ( ) ) { listener
. onSelectResult ( null
) ; return ; } int numDevices
= onlineDevices
. size ( ) ; List
< String
> deviceIds
= new ArrayList
< > ( numDevices
) ; onlineDevices
. forEach ( ( device
) -> { deviceIds
. add ( device
. getDeviceId ( ) ) ; } ) ; 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 的能力:
private ClickedListener mStartRemoteFAListener
= new
ClickedListener ( ) { @Overridepublic
void onClick ( Component arg0
) { scheduleRemoteAbility ( new
ISelectResult ( ) { @Override
void onSelectResult ( String deviceId
) { if ( deviceId
!= null
) { 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
) ; startAbility ( intent
) ; } } } ) ; } } ;
為啟動和關閉 PA 定義回調,實現(xiàn)啟動和關閉 PA 的能力。 對于 PA 的啟動、關閉、連接等操作都需要開發(fā)者提供目標設備的 deviceId。開發(fā)者可以通過 DeviceManager 相關接口得到當前組網(wǎng)下的設備列表,并以彈窗的形式供用戶選擇,也可以按照實際需要實現(xiàn)其他個性化的處理方式。 在點擊事件回調函數(shù)中,需要開發(fā)者指定得到 deviceId 后的處理邏輯,即實現(xiàn)類似上例中 listener.onSelectResult(String deviceId) 的方法,代碼示例如下:
private ClickedListener mStartRemotePAListener
= new
ClickedListener ( ) { @Overridepublic
void onClick ( Component arg0
) { scheduleRemoteAbility ( new
ISelectResult ( ) { @Override
void onSelectResult ( String deviceId
) { if ( deviceId
!= null
) { 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
) ; } } } ) ; } } ; private ClickedListener mStopRemotePAListener
= new
ClickedListener ( ) { @Overridepublic
void onClick ( Component arg0
) { scheduleRemoteAbility ( new
ISelectResult ( ) { @Override
void onSelectResult ( String deviceId
) { if ( deviceId
!= null
) { 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í)行特定任務,以及斷開連接:
private MyRemoteProxy mProxy
= null
; private IAbilityConnection mConn
= new
IAbilityConnection ( ) { @Overridepublic
void onAbilityConnectDone ( ElementName element
, IRemoteObject remote
, int resultCode
) { mProxy
= new
MyRemoteProxy ( remote
) ; btnConnectRemotePA
. setText ( "connectRemoteAbility done" ) ; } @Overridepublic
void onAbilityDisconnectDone ( ElementName element
, int resultCode
) { disconnectAbility ( mConn
) ; } } ;
僅通過啟動/關閉兩種方式對 PA 進行調度無法應對需長期交互的場景,因此,分布式任務調度平臺向開發(fā)者提供了跨設備 PA 連接及斷開連接的能力。 為了對已連接 PA 進行管理,開發(fā)者需要實現(xiàn)一個滿足 IAbilityConnection 接口的連接狀態(tài)檢測實例,通過該實例可以對連接及斷開連接完成時設置具體的處理邏輯,例如:獲取控制對端PA的代理等。進一步為了使用該代理跨設備調度 PA,開發(fā)者需要在本地及對端分別實現(xiàn)對外接口一致的代理。一個具備加法能力的代理示例如下:
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 ( ) ; 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)對應的客戶端,代碼示例如下所示:
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 還需要作如下修改:
private MyRemote remote
= new
MyRemote ( ) ; @Overrideprotected IRemoteObject
onConnect ( Intent intent
) { super
. onConnect ( intent
) ; return remote
. asObject ( ) ; }
完成上述步驟后,可以通過點擊事件實現(xiàn)連接、利用連接關系控制 PA 以及斷開連接等行為,代碼示例如下:
private ClickedListener mConnectRemotePAListener
= new
ClickedListener ( ) { @Overridepublic
void onClick ( Component arg0
) { scheduleRemoteAbility ( new
ISelectResult ( ) { @Override
void onSelectResult ( String deviceId
) { if ( deviceId
!= null
) { Intent connectPAIntent
= new
Intent ( ) ; Operation operation
= new Intent
. OperationBuilder ( ) . withDeviceId ( deviceId
) . withBundleName ( bundleName
) . withAbilityName ( abilityName
) . withFlags ( Intent
. FLAG_ABILITYSLICE_MULTI_DEVICE
) . build ( ) ; connectPAIntent
. setOperation ( operation
) ; connectAbility ( connectPAIntent
, mConn
) ; } } } ) ; } } ; 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
) ; } } } ; private ClickedListener mDisconnectRemotePAListener
= new
ClickedListener ( ) { @Overridepublic
void onClick ( Component arg0
) { btnConnectRemotePA
. setText ( "ConnectRemotePA" ) ; btnControlRemotePA
. setText ( "ControlRemotePA" ) ; disconnectAbility ( mConn
) ; } } ;
設備 A 將運行時的 FA 遷移到設備 B,實現(xiàn)業(yè)務在設備間無縫遷移:
private ClickedListener mContinueAbilityListener
= new
ClickedListener ( ) { @Overridepublic
void onClick ( Component arg0
) { 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
) { 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)站內容還不錯,歡迎將生活随笔 推薦給好友。