生活随笔
收集整理的這篇文章主要介紹了
HarmonyOS之分布式任务调度开发流程
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、概述
① 分布式任務(wù)調(diào)度
在 HarmonyOS 中,分布式任務(wù)調(diào)度平臺(tái)對搭載 HarmonyOS 的多設(shè)備構(gòu)筑的“超級虛擬終端”提供統(tǒng)一的組件管理能力,為應(yīng)用定義統(tǒng)一的能力基線、接口形式、數(shù)據(jù)結(jié)構(gòu)、服務(wù)描述語言,屏蔽硬件差異;支持遠(yuǎn)程啟動(dòng)、遠(yuǎn)程調(diào)用、業(yè)務(wù)無縫遷移等分布式任務(wù)。 分布式任務(wù)調(diào)度平臺(tái)在底層實(shí)現(xiàn) Ability(分布式任務(wù)調(diào)度的基本組件)跨設(shè)備的啟動(dòng)/關(guān)閉、連接及斷開連接以及遷移等能力,實(shí)現(xiàn)跨設(shè)備的組件管理: 啟動(dòng)和關(guān)閉:向開發(fā)者提供管理遠(yuǎn)程 Ability 的能力,即支持啟動(dòng) Page 模板的 Ability,以及啟動(dòng)、關(guān)閉 Service 和 Data 模板的 Ability。 連接和斷開連接:向開發(fā)者提供跨設(shè)備控制服務(wù)(Service 和 Data 模板的 Ability)的能力,開發(fā)者可以通過與遠(yuǎn)程服務(wù)連接及斷開連接實(shí)現(xiàn)獲取或注銷跨設(shè)備管理服務(wù)的對象,達(dá)到和本地一致的服務(wù)調(diào)度。 遷移能力:向開發(fā)者提供跨設(shè)備業(yè)務(wù)的無縫遷移能力,開發(fā)者可以通過調(diào)用 Page 模板 Ability 的遷移接口,將本地業(yè)務(wù)無縫遷移到指定設(shè)備中,打通設(shè)備間壁壘。
② 約束與限制
開發(fā)者需要在 Intent 中設(shè)置支持分布式的標(biāo)記(例如: Intent.FLAG_ABILITYSLICE_MULTI_DEVICE 表示該應(yīng)用支持分布式調(diào)度),否則將無法獲得分布式能力。 開發(fā)者通過在 config.json 中的 reqPermissions 字段里添加多設(shè)備協(xié)同訪問的權(quán)限申請:三方應(yīng)用使用{“name”: “ohos.permission.DISTRIBUTED_DATASYNC”}。 PA(Particle Ability,Service 和 Data 模板的 Ability)的調(diào)用支持連接及斷開連接、啟動(dòng)及關(guān)閉這四類行為,在進(jìn)行調(diào)度時(shí): 開發(fā)者必須在 Intent 中指定 PA 對應(yīng)的 bundleName 和 abilityName。 當(dāng)開發(fā)者需要跨設(shè)備啟動(dòng)、關(guān)閉或連接 PA 時(shí),需要在 Intent 中指定對端設(shè)備的 deviceId。開發(fā)者可通過如設(shè)備管理類 DeviceManager 提供的 getDeviceList 獲取指定條件下匿名化處理的設(shè)備列表,實(shí)現(xiàn)對指定設(shè)備 PA 的啟動(dòng)/關(guān)閉以及連接管理。 FA(Feature Ability,Page 模板的 Ability)的調(diào)用支持啟動(dòng)和遷移行為,在進(jìn)行調(diào)度時(shí): 當(dāng)啟動(dòng) FA 時(shí),需要開發(fā)者在 Intent 中指定對端設(shè)備的 deviceId、bundleName 和 abilityName。 FA 的遷移實(shí)現(xiàn)相同 bundleName 和 abilityName 的 FA 跨設(shè)備遷移,因此需要指定遷移設(shè)備的 deviceId。 DevEco Studio 遠(yuǎn)程模擬設(shè)備的功能無法調(diào)測分布式任務(wù)調(diào)度,需要在真機(jī)環(huán)境下進(jìn)行測試。
二、場景介紹
開發(fā)者在應(yīng)用中集成分布式調(diào)度能力,通過調(diào)用指定能力的分布式接口,實(shí)現(xiàn)跨設(shè)備能力調(diào)度。根據(jù) Ability 模板及意圖的不同,分布式任務(wù)調(diào)度向開發(fā)者提供以下六種能力:啟動(dòng)遠(yuǎn)程 FA、啟動(dòng)遠(yuǎn)程 PA、關(guān)閉遠(yuǎn)程 PA、連接遠(yuǎn)程 PA、斷開連接遠(yuǎn)程 PA 和 FA 跨設(shè)備遷移。 下面以設(shè)備 A(本地設(shè)備)和設(shè)備 B(遠(yuǎn)端設(shè)備)為例,進(jìn)行場景介紹: 設(shè)備 A 啟動(dòng)設(shè)備 B 的 FA:在設(shè)備 A 上通過本地應(yīng)用提供的啟動(dòng)按鈕,啟動(dòng)設(shè)備 B 上對應(yīng)的 FA。例如:設(shè)備 A 控制設(shè)備 B 打開相冊,只需開發(fā)者在啟動(dòng) FA 時(shí)指定打開相冊的意圖即可。 設(shè)備 A 啟動(dòng)設(shè)備 B 的 PA:在設(shè)備 A 上通過本地應(yīng)用提供的啟動(dòng)按鈕,啟動(dòng)設(shè)備 B 上指定的 PA。例如:開發(fā)者在啟動(dòng)遠(yuǎn)程服務(wù)時(shí)通過意圖指定音樂播放服務(wù),即可實(shí)現(xiàn)設(shè)備 A 啟動(dòng)設(shè)備 B 音樂播放的能力。 設(shè)備 A 關(guān)閉設(shè)備 B 的 PA:在設(shè)備 A 上通過本地應(yīng)用提供的關(guān)閉按鈕,關(guān)閉設(shè)備 B 上指定的 PA。類似啟動(dòng)的過程,開發(fā)者在關(guān)閉遠(yuǎn)程服務(wù)時(shí)通過意圖指定音樂播放服務(wù),即可實(shí)現(xiàn)關(guān)閉設(shè)備 B 上該服務(wù)的能力。 設(shè)備 A 連接設(shè)備 B 的 PA:在設(shè)備 A 上通過本地應(yīng)用提供的連接按鈕,連接設(shè)備 B 上指定的 PA。連接后,通過其他功能相關(guān)按鈕實(shí)現(xiàn)控制對端 PA 的能力。通過連接關(guān)系,開發(fā)者可以實(shí)現(xiàn)跨設(shè)備的同步服務(wù)調(diào)度,實(shí)現(xiàn)如大型計(jì)算任務(wù)互助等價(jià)值場景。 設(shè)備 A 與設(shè)備 B 的 PA 斷開連接:在設(shè)備 A 上通過本地應(yīng)用提供斷開連接的按鈕,將之前已連接的 PA 斷開連接。 設(shè)備 A 的 FA 遷移至設(shè)備 B:設(shè)備 A 上通過本地應(yīng)用提供的遷移按鈕,將設(shè)備 A 的業(yè)務(wù)無縫遷移到設(shè)備 B 中。通過業(yè)務(wù)遷移能力,打通設(shè)備 A 和設(shè)備 B 間的壁壘,實(shí)現(xiàn)如文檔跨設(shè)備編輯、視頻從客廳到房間跨設(shè)備接續(xù)播放等場景。
三、API 說明
分布式調(diào)度平臺(tái)提供的連接和斷開連接 PA、啟動(dòng)遠(yuǎn)程 FA、啟動(dòng)和關(guān)閉 PA 以及遷移 FA 的能力,是實(shí)現(xiàn)更多價(jià)值性場景的基礎(chǔ)。
① 連接遠(yuǎn)程 PA
connectAbility(Intent intent, IAbilityConnection conn)接口提供連接指定設(shè)備上 PA 的能力,Intent 中指定待連接 PA 的設(shè)備 deviceId、bundleName 和 abilityName。 當(dāng)連接成功后,通過在 conn 定義的 onAbilityConnectDone 回調(diào)中獲取對端 PA 的服務(wù)代理,兩者的連接關(guān)系則由 conn 維護(hù)。具體的參數(shù)定義如下表所示:
參數(shù)名類型說明 intent ohos.aafwk.content.Intent 開發(fā)者需在intent對應(yīng)的Operation中指定待連接PA的設(shè)備deviceId、bundleName和abilityName conn ohos.aafwk.ability.IAbilityConnection 當(dāng)連接成功或失敗時(shí),作為連接關(guān)系的回調(diào)接口。該接口提供連接完成和斷開連接完成時(shí)的處理邏輯,開發(fā)者可根據(jù)具體的場景進(jìn)行定義
② 啟動(dòng)遠(yuǎn)程 FA/PA
startAbility(Intent intent)接口提供啟動(dòng)指定設(shè)備上 FA 和 PA 的能力,Intent 中指定待啟動(dòng) FA/PA 的設(shè)備 deviceId、bundleName 和 abilityName。 具體參數(shù)定義如下表所示:
參數(shù)名類型說明 intent ohos.aafwk.content.Intent 當(dāng)開發(fā)者需要調(diào)用該接口啟動(dòng)遠(yuǎn)程PA時(shí),需要指定待啟動(dòng)PA的設(shè)備deviceId、bundleName和abilityName。若不指定設(shè)備deviceId,則無法跨設(shè)備調(diào)用PA。類似地,在啟動(dòng)FA時(shí),也需要開發(fā)者指定啟動(dòng)FA的設(shè)備deviceId、bundleName和abilityName
分布式調(diào)度平臺(tái)還會(huì)提供與上述功能相對應(yīng)的斷開遠(yuǎn)程 PA 的連接和關(guān)閉遠(yuǎn)程 PA 的接口,相關(guān)的參數(shù)與連接、啟動(dòng)的接口類似。 斷開遠(yuǎn)程 PA 連接:disconnectAbility?(IAbilityConnection conn)。 關(guān)閉遠(yuǎn)程 PA:stopAbility?(Intent intent)。
③ 遷移 FA
continueAbility(String deviceId) 接口提供將本地FA遷移到指定設(shè)備上的能力,需要開發(fā)者在調(diào)用時(shí)指定目標(biāo)設(shè)備的 deviceId。具體參數(shù)定義如下表所示:
參數(shù)名類型說明 deviceId String 當(dāng)開發(fā)者需要調(diào)用該接口將本地FA遷移時(shí),需要指定目標(biāo)設(shè)備的deviceId
Ability 和 AbilitySlice 類均需要實(shí)現(xiàn) IAbilityContinuation 及其方法,才可以實(shí)現(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
;
編寫一個(gè)基本的 FA 用于使用分布式能力:
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 對應(yīng)的 config.json 中聲明多設(shè)備協(xié)同訪問的權(quán)限:三方應(yīng)用使用{“name”: “ohos.permission.DISTRIBUTED_DATASYNC”}。一個(gè)三方應(yīng)用部署的示例如下:
{ "module" : { "reqPermissions" : [ { "name" : "ohos.permission.DISTRIBUTED_DATASYNC" } , { . . . } ] } }
對于三方應(yīng)用還要求在實(shí)現(xiàn) Ability 的代碼中顯式聲明需要使用的權(quán)限,如下所示:
public class SampleSlice extends AbilitySlice
{ @Overridepublic
void onStart ( Intent intent
) { requestPermissionsFromUser ( new String
[ ] { "ohos.permission.DISTRIBUTED_DATASYNC" } , 0 ) ; super
. onStart ( intent
) ; } }
為不同的能力設(shè)置相應(yīng)的控制按鈕:
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
) ; }
通過設(shè)備管理 DeviceManager 提供的 getDeviceList 接口獲取設(shè)備列表,用于指定目標(biāo)設(shè)備:
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
) ; }
上述實(shí)例中涉及對在線組網(wǎng)設(shè)備的查詢,該項(xiàng)能力需要開發(fā)者在對應(yīng)的 config.json 中聲明獲取設(shè)備列表及設(shè)備信息的權(quán)限,如下所示:
{ "reqPermissions" : [ { "name" : "ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE" } , { "name" : "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO" } , { "name" : "ohos.permission.GET_BUNDLE_INFO" } ] }
為啟動(dòng)遠(yuǎn)程 FA 的按鈕設(shè)置點(diǎn)擊回調(diào),實(shí)現(xiàn)啟動(dòng)遠(yuǎ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
) ; } } } ) ; } } ;
為啟動(dòng)和關(guān)閉 PA 定義回調(diào),實(shí)現(xiàn)啟動(dòng)和關(guān)閉 PA 的能力。 對于 PA 的啟動(dòng)、關(guān)閉、連接等操作都需要開發(fā)者提供目標(biāo)設(shè)備的 deviceId。開發(fā)者可以通過 DeviceManager 相關(guān)接口得到當(dāng)前組網(wǎng)下的設(shè)備列表,并以彈窗的形式供用戶選擇,也可以按照實(shí)際需要實(shí)現(xiàn)其他個(gè)性化的處理方式。 在點(diǎn)擊事件回調(diào)函數(shù)中,需要開發(fā)者指定得到 deviceId 后的處理邏輯,即實(shí)現(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
) ; } } } ) ; } } ;
啟動(dòng)和關(guān)閉的行為類似,只需在 Intent 中指定待調(diào)度 PA 的 deviceId、bundleName 和 abilityName,并以 operation 的形式封裝到 Intent 內(nèi)。通過AbilitySlice(Ability)包含的 startAbility() 和 stopAbility() 接口即可實(shí)現(xiàn)相應(yīng)功能。 設(shè)備 A 連接設(shè)備 B 側(cè)的 PA,利用連接關(guān)系調(diào)用該 PA 執(zhí)行特定任務(wù),以及斷開連接:
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
) ; } } ;
僅通過啟動(dòng)/關(guān)閉兩種方式對 PA 進(jìn)行調(diào)度無法應(yīng)對需長期交互的場景,因此,分布式任務(wù)調(diào)度平臺(tái)向開發(fā)者提供了跨設(shè)備 PA 連接及斷開連接的能力。 為了對已連接 PA 進(jìn)行管理,開發(fā)者需要實(shí)現(xiàn)一個(gè)滿足 IAbilityConnection 接口的連接狀態(tài)檢測實(shí)例,通過該實(shí)例可以對連接及斷開連接完成時(shí)設(shè)置具體的處理邏輯,例如:獲取控制對端PA的代理等。進(jìn)一步為了使用該代理跨設(shè)備調(diào)度 PA,開發(fā)者需要在本地及對端分別實(shí)現(xiàn)對外接口一致的代理。一個(gè)具備加法能力的代理示例如下:
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需要實(shí)現(xiàn)對應(yīng)的客戶端,代碼示例如下所示:
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
; } }
對端除了要實(shí)現(xiàn)如上所述的客戶端外,待連接的 PA 還需要作如下修改:
private MyRemote remote
= new
MyRemote ( ) ; @Overrideprotected IRemoteObject
onConnect ( Intent intent
) { super
. onConnect ( intent
) ; return remote
. asObject ( ) ; }
完成上述步驟后,可以通過點(diǎn)擊事件實(shí)現(xiàn)連接、利用連接關(guā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
) ; } } ;
設(shè)備 A 將運(yùn)行時(shí)的 FA 遷移到設(shè)備 B,實(shí)現(xiàn)業(yè)務(wù)在設(shè)備間無縫遷移:
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ā)者實(shí)現(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" ) ; } }
通過自定義遷移事件相關(guān)的行為,最終實(shí)現(xiàn)對 Ability 的遷移,此處主要以較為常用的兩個(gè)事件,包括遷移發(fā)起端完成遷移的回調(diào) onCompleteContinuation(int result) 以及接收到遠(yuǎn)端遷移行為傳遞數(shù)據(jù)的回調(diào) onRestoreData(IntentParams restoreData)。其他還包括遷移到遠(yuǎn)端設(shè)備的 FA 關(guān)閉的回調(diào) onRemoteTerminated()、用于本地遷移發(fā)起時(shí)保存狀態(tài)數(shù)據(jù)的回調(diào)onSaveData(IntentParams saveData)和本地發(fā)起遷移的回調(diào)onStartContinuation()。 按照實(shí)際應(yīng)用自定義特定場景對應(yīng)的回調(diào),可以完成多種場景下 FA 的遷移任務(wù)。FA 遷移可以打通設(shè)備間的壁壘,有助于不同能力的設(shè)備進(jìn)行互助。 FA 遷移過程中,遠(yuǎn)端 FA 首先接收到發(fā)起端 FA 傳輸?shù)臄?shù)據(jù),再執(zhí)行啟動(dòng),即 onRestoreData() 發(fā)生在 onStart() 之前。
五、實(shí)例參考
演示分布式任務(wù)調(diào)度的六種場景:啟動(dòng)遠(yuǎn)程FA,啟動(dòng)遠(yuǎn)程PA,關(guān)閉遠(yuǎn)程PA,連接遠(yuǎn)程PA,斷開連接遠(yuǎn)程PA, 和FA跨端遷移:DistributedScheduler。
總結(jié)
以上是生活随笔 為你收集整理的HarmonyOS之分布式任务调度开发流程 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。