色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

鴻蒙應用開發入門之跨設備遷移

鴻蒙系統HarmonyOS ? 來源:51cto ? 作者:zhonghongfa ? 2021-04-16 15:38 ? 次閱讀

1. 分布式任務調度概述

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

2. 實現調度的約束與限制

1)遠程調用PA/FA,開發者需要在Intent中設置支持分布式的標記(例如:Intent.FLAG_ABILITYSLICE_MULTI_DEVICE表示該應用支持分布式調度),否則將無法獲得分布式能力。

2)開發者通過在config.json中的reqPermissions字段里添加權限申請:

(1)以獲取跨設備連接的能力和分布式數據傳輸的權限。

分布式數據傳輸的權限:

{“name”: “ohos.permission.servicebus.ACCESS_SERVICE”}

三方應用使用權限:

{“name”: “ohos.permission.servicebus.DISTRIBUTED_DATASYNC”}

系統應用使用權限:

{“name”: “com.huawei.hwddmp.servicebus.BIND_SERVICE”}

(2)另外還有三個獲取分布式設備信息需要的權限:

{“name”: “ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE”},

{“name”: “ohos.permission.GET_DISTRIBUTED_DEVICE_INFO” },

{ “name”: “ohos.permission.GET_BUNDLE_INFO”}

注意:還需要在開發的時候,要在Ability里主動聲明,要用到的權限。

3)FA(Feature Ability,Page模板的Ability)的調用支持啟動和遷移行為,在進行調度時:

(1)當啟動FA時,需要開發者在Intent中指定對端設備的deviceId、bundleName和abilityName。

(2)FA的遷移實現相同bundleName和abilityName的FA跨設備遷移,因此需要指定遷移設備的deviceId。

3. 實現場景介紹

下面以設備A(本地設備)和設備B(遠端設備)為例,介紹下面我們要實現的場景:

1)設備A啟動設備B的FA:在設備A上通過本地應用提供的啟動按鈕,啟動設備B上對應的FA。

2)設備A的FA遷移至設備B:設備A上通過本地應用提供的遷移按鈕,將設備A的業務無縫遷移到設備B中。

3)設備A的FA遷移至設備B,還可以實現主動撤回遷移。

4. 具體實現前先了解要用的接口

1)啟動遠程FA

startAbility(Intent intent)接口提供啟動指定設備上FA和PA的能力,Intent中指定待啟動FA的設備deviceId、bundleName和abilityName。

2)遷移FA

continueAbility(String deviceId)接口提供將本地FA遷移到指定設備上的能力,continueAbilityReversibly(String deviceId) 接口提供將本地FA遷移到指定設備上的能力,這種遷移可撤回, reverseContinueAbility()接口提供撤回遷移的能力。

5. 實戰遠程啟動FA頁面

1)編程實現上面場景的界面:

ability_main.xml

《?xml version=“1.0” encoding=“utf-8”?》

《DirectionalLayout

xmlns:ohos=“http://schemas.huawei.com/res/ohos”

ohos:height=“match_parent”

ohos:width=“match_parent”

ohos:orientation=“vertical”》

《Button

ohos:id=“$+id:migration_btn_01”

ohos:height=“match_content”

ohos:width=“300vp”

ohos:text=“1.啟動遠程設備的FA”

ohos:text_size=“20fp”

ohos:text_color=“#ffffff”

ohos:background_element=“$graphic:button_bg”

ohos:layout_alignment=“horizontal_center”

ohos:top_padding=“8vp”

ohos:bottom_padding=“8vp”

ohos:left_padding=“40vp”

ohos:right_padding=“40vp”

ohos:top_margin=“20vp”

/》

《Button

ohos:id=“$+id:migration_btn_02”

ohos:height=“match_content”

ohos:width=“300vp”

ohos:text=“2.遷移到遠程設備”

ohos:text_size=“20fp”

ohos:text_color=“#ffffff”

ohos:background_element=“$graphic:button_bg”

ohos:layout_alignment=“horizontal_center”

ohos:top_padding=“8vp”

ohos:bottom_padding=“8vp”

ohos:left_padding=“40vp”

ohos:right_padding=“40vp”

ohos:top_margin=“20vp”

/》

《Button

ohos:id=“$+id:migration_btn_03”

ohos:height=“match_content”

ohos:width=“300vp”

ohos:text=“3.可遷回的遷移遠程設備”

ohos:text_size=“20fp”

ohos:text_color=“#ffffff”

ohos:background_element=“$graphic:button_bg”

ohos:layout_alignment=“horizontal_center”

ohos:top_padding=“8vp”

ohos:bottom_padding=“8vp”

ohos:left_padding=“40vp”

ohos:right_padding=“40vp”

ohos:top_margin=“20vp”

/》

《/DirectionalLayout》1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.

復制button_bg.xml

《?xml version=“1.0” encoding=“utf-8”?》

《shape xmlns:ohos=“http://schemas.huawei.com/res/ohos”

ohos:shape=“rectangle”》

《solid ohos:color=“#007DFF”/》

《corners ohos:radius=“40”/》

《/shape》1.2.3.4.5.6.

復制MigrationAbility和MigrationBackAbility

// 調用AbilitySlice模板實現一個用于控制基礎功能的FA

// Ability和AbilitySlice類均需要實現IAbilityContinuation及其方法,才可以實現FA遷移。AbilitySlice的代碼示例如下

public class SampleSlice extends AbilitySlice implements IAbilityContinuation {

@Override

public void onStart(Intent intent) {

super.onStart(intent);

super.setUIContent(layout);

}1.2.3.4.5.6.7.8.9.

復制ability_migration.xml

《?xml version=“1.0” encoding=“utf-8”?》

《DirectionalLayout

xmlns:ohos=“http://schemas.huawei.com/res/ohos”

ohos:height=“match_parent”

ohos:width=“match_parent”

ohos:background_element=“#00ffff”

ohos:orientation=“vertical”》

《Text

ohos:id=“$+id:text_title”

ohos:height=“match_content”

ohos:width=“250vp”

ohos:background_element=“#0088bb”

ohos:layout_alignment=“horizontal_center”

ohos:text=“下面是一個可編輯的文本框”

ohos:text_size=“50”

ohos:padding=“5vp”

ohos:top_margin=“30vp”

/》

《TextField

ohos:id=“$+id:textfield_back”

ohos:height=“250vp”

ohos:width=“250vp”

ohos:hint=“請輸入。。.”

ohos:layout_alignment=“horizontal_center”

ohos:background_element=“#ffffff”

ohos:text_color=“#888888”

ohos:text_size=“20fp”

ohos:padding=“5vp”

/》

《Button

ohos:id=“$+id:migration_button”

ohos:height=“match_content”

ohos:width=“match_content”

ohos:text=“點擊遷移”

ohos:text_size=“20fp”

ohos:text_color=“#ffffff”

ohos:background_element=“$graphic:button_bg”

ohos:top_padding=“8vp”

ohos:bottom_padding=“8vp”

ohos:left_padding=“50vp”

ohos:right_padding=“50vp”

ohos:layout_alignment=“horizontal_center”

ohos:top_margin=“30vp”

/》

《/DirectionalLayout》1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.

復制ability_migration_back.xml比ability_migration.xml多一個遷回按鈕,另外主頁上點擊按鈕跳轉等,略。。.

2)使用分布式能力要求開發者在Ability對應的config.json中聲明多設備協同訪問的權限:

(1)三方應用部署權限、分布式數據傳輸的權限、系統應用使用權限的申請。

{

“reqPermissions”: [

{“name”: “ohos.permission.DISTRIBUTED_DATASYNC”},

{“name”: “ohos.permission.servicebus.ACCESS_SERVICE”},

{“name”: “com.huawei.hwddmp.servicebus.BIND_SERVICE”}

}1.2.3.4.5.6.7.

復制(2)聲明分布式獲取設備列表及設備信息的權限,如下所示:

{

“reqPermissions”: [

{“name”: “ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE”},

{“name”: “ohos.permission.GET_DISTRIBUTED_DEVICE_INFO” },

{“name”: “ohos.permission.GET_BUNDLE_INFO”}

}1.2.3.4.5.6.7.

復制(3)對于三方應用還要求在實現Ability的代碼中顯式聲明需要使用的權限。

public class SampleSlice extends AbilitySlice implements IAbilityContinuation {

@Override

public void onStart(Intent intent) {

// 開發者顯示聲明需要使用的權限

requestPermissionsFromUser(new String[]{“ohos.permission.DISTRIBUTED_DATASYNC”,

“ohos.permission.servicebus.ACCESS_SERVICE”,

“com.huawei.hwddmp.servicebus.BIND_SERVICE”}, 0);

super.onStart(intent);

}

}1.2.3.4.5.6.7.8.9.10.

復制3) 為啟動遠程FA的按鈕添加點擊事件,獲取設備信息,實現啟動遠程FA的能力。

Button btn1 = (Button) findComponentById(ResourceTable.Id_migration_btn_01);

btn1.setClickedListener(new Component.ClickedListener() {

@Override

public void onClick(Component component) {

// 調用DeviceManager的getDeviceList接口,通過FLAG_GET_ONLINE_DEVICE標記獲得在線設備列表

List《DeviceInfo》 onlineDevices = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);

// 判斷組網設備是否為空

if (onlineDevices.isEmpty()) {

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);

//獲取設備ID,最好放到工具類里,很多地方要用!

if(selectDeviceId!=null){

Intent intent2 = new Intent();

Operation operation = new Intent.OperationBuilder()

.withDeviceId(selectDeviceId)

.withBundleName(“cn.ybzy.hmsdemo”)

.withAbilityName(“cn.ybzy.hmsdemo.RemoteAbility”)

.withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)

.build();

intent2.setOperation(operation);

// 通過AbilitySlice包含的startAbility接口實現跨設備啟動FA

startAbility(intent2);

}

}

});1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.

復制6. 實戰將設備A運行時的FA遷移到設備B,實現業務在設備間無縫遷移。

MigrationAbility

public class MigrationAbility extends Ability implements IAbilityContinuation {

@Override

public void onStart(Intent intent) {

super.onStart(intent);

super.setMainRoute(MigrationAbilitySlice.class.getName());

}

@Override

public boolean onStartContinuation() {

return true;

}

@Override

public boolean onSaveData(IntentParams intentParams) {

return true;

}

@Override

public boolean onRestoreData(IntentParams intentParams) {

return true;

}

@Override

public void onCompleteContinuation(int i) {

}

}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.

復制

MigrationAbilitySlice

public class MigrationAbilitySlice extends AbilitySlice implements IAbilityContinuation {

TextField textField;

String textStr = “請輸入數據。。.”;

@Override

public void onStart(Intent intent) {

super.onStart(intent);

super.setUIContent(ResourceTable.Layout_ability_migration);

textField = (TextField)findComponentById(ResourceTable.Id_textfield_migration);

textField.setText(textStr);

Button btn = (Button) findComponentById(ResourceTable.Id_migration_button);

btn.setClickedListener(new Component.ClickedListener() {

@Override

public void onClick(Component component) {

String deviceId = getDeviceId();

if(deviceId!=null){

continueAbility(deviceId);

}

}

});

}

private String getDeviceId(){

// 調用DeviceManager的getDeviceList接口,通過FLAG_GET_ONLINE_DEVICE標記獲得在線設備列表

List《DeviceInfo》 onlineDevices = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);

// 判斷組網設備是否為空

if (onlineDevices.isEmpty()) {

return null;

}

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);

return selectDeviceId;

}

@Override

public boolean onStartContinuation() {

return true;

}

@Override

public boolean onSaveData(IntentParams intentParams) {

intentParams.setParam(“data”,textField.getText());

return true;

}

@Override

public boolean onRestoreData(IntentParams intentParams) {

textStr = intentParams.getParam(“data”).toString();

return true;

}

@Override

public void onCompleteContinuation(int i) {

}

@Override

public void onRemoteTerminated() {

}

}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.

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

7. 請求回遷

Button btn1 = (Button) findComponentById(ResourceTable.Id_migration_button_back);

btn1.setClickedListener(new Component.ClickedListener() {

@Override

public void onClick(Component component) {

String deviceId = DeviceUtils.getDeviceId();

if(deviceId!=null){

continueAbilityReversibly(deviceId); //可撤回遷移

}

}

});

Button btn2 = (Button) findComponentById(ResourceTable.Id_migration_button_back2);

btn2.setClickedListener(new Component.ClickedListener() {

@Override

public void onClick(Component component) {

reverseContinueAbility(); //撤回遷移

}

});1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.

復制1)設備A上的Page請求回遷。

2)系統回調設備B上Page及其AbilitySlice棧中所有AbilitySlice實例的IAbilityContinuation.onStartContinuation()方法,以確認當前是否可以立即遷移。

3)如果可以立即遷移,則系統回調設備B上Page及其AbilitySlice棧中所有AbilitySlice實例的IAbilityContinuation.onSaveData()方法,以便保存回遷后恢復狀態必須的數據。

4)如果保存數據成功,則系統在設備A上Page恢復AbilitySlice棧,然后回調IAbilityContinuation.onRestoreData()方法,傳遞此前保存的數據。

5)如果數據恢復成功,則系統終止設備B上Page的生命周期。

編輯:hfy

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

    關注

    79

    文章

    1978

    瀏覽量

    30273
收藏 人收藏

    評論

    相關推薦

    鴻蒙OS 設備遷移

    設備遷移(下文簡稱“遷移”)支持將 Page 在同一用戶的不同設備遷移,以便支持用戶無縫切換
    的頭像 發表于 01-31 15:47 ?1152次閱讀

    AKI語言調用庫神助攻C/C++代碼遷移至HarmonyOS NEXT

    /C++代碼快速遷移至HarmonyOS NEXT。憑借卓越的兼容性,AKI已成為廠商與開發者打造鴻蒙原生應用過程中廣泛使用的語言調用解決方案。 AKI是一款專為
    發表于 01-02 17:08

    如何理解鴻蒙OS是設備的?

    誰能幫忙解釋鴻蒙OS是怎樣實現平臺的?
    發表于 09-08 18:17

    怎么入門DevEco Studio 分布式設備應用開發

    想知道怎么入門DevEco Studio 分布式設備應用開發
    發表于 09-18 15:50

    鴻蒙設備學習菜鳥指南》 【五、搭建開發環境】

    ` 本帖最后由 HonestQiao 于 2020-10-30 14:00 編輯 《鴻蒙設備學習菜鳥指南》 【五、搭建開發環境】[目錄索引]五、搭建
    發表于 10-30 13:59

    課程推薦【1】 | 鴻蒙設備開發入門

    ,Android。出版書籍《物聯網——嵌入式開發實戰》你將會學到:本課程將帶大家入門HarmonyOS設備開發,以Hi3861鴻蒙
    發表于 12-28 16:26

    #2020征文-手機#【鴻蒙基地】鴻蒙設備啟動窗口:Page Ability

    HarmonyOS的核心特性(或稱為賣點)之一就是軟總線技術,而Page Ability的設備遷移是軟總線的一個具體技術實現。所謂設備
    發表于 12-31 11:56

    #2020征文-手機#【鴻蒙基地】鴻蒙設備啟動窗口:Page Ability

    HarmonyOS的核心特性(或稱為賣點)之一就是軟總線技術,而Page Ability的設備遷移是軟總線的一個具體技術實現。所謂設備
    發表于 01-25 14:13

    HarmonyOS分布式——設備遷移

    HarmonyOS分布式——設備遷移
    發表于 06-26 14:34

    HarmonyOS教程—基于設備遷移和分布式文件能力,實現郵件的設備編輯和附件的調用

    操作。想要解決這些問題,我們可以通過HarmonyOS的分布式能力實現任務的設備遷移,保證業務在手機、平板等終端間無縫銜接,輕松的完成多設備之間的協同辦公。本篇Codelab文檔,我
    發表于 09-09 10:03

    鴻蒙應用開發入門資料合集

    應用開發入門資料六:實現設備遷移分布式任務調度概述在HarmonyOS中,分布式任務調度平臺對搭載HarmonyOS的多
    發表于 03-22 11:23

    通過HarmonyOS分布式能力實現任務的設備遷移設計資料分享

    的文檔或圖片素材,此時需要在不同設備間反復操作。想要解決這些問題,我們可以通過 HarmonyOS 的分布式能力實現任務的設備遷移,保證業務在手機、平板等終端間無縫銜接,輕松的完成多
    發表于 03-25 16:59

    HarmonyOS應用開發-DiseributedVideoCodelab設備視頻遷移

    說明:此Demo用于設備遷移視頻內容。您可以方便地跨設備遷移視頻內容,然后在源設備遠程控制、操
    發表于 07-05 10:24

    什么是HarmonyOS“設備遷移”?

    什么是HarmonyOS“設備遷移”? HarmonyOS“設備遷移”是指將承載業務的Pag
    的頭像 發表于 06-25 17:32 ?5372次閱讀

    鴻蒙開發:應用組件設備交互(流轉)【遷移

    遷移的核心任務是將應用的當前狀態(包括頁面控件、狀態變量等)無縫遷移到另一設備,從而在新設備上無縫接續應用體驗。這意味著用戶在一臺
    的頭像 發表于 06-11 17:10 ?1294次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>:應用組件<b class='flag-5'>跨</b><b class='flag-5'>設備</b>交互(流轉)【<b class='flag-5'>跨</b>端<b class='flag-5'>遷移</b>】
    主站蜘蛛池模板: 国产av在线看的| 啊灬啊别停灬用力啊在线观看视频| 伊人精品影院| 国产色婷亚洲99精品AV| 日韩1区1区产品乱码芒果榴莲| 中文字幕亚洲无线码高清不卡| 国产视频a在线观看v| 网红主播 国产精品 开放90后| xxx日本hd| 热久久国产欧美一区二区精品| 99精品欧美一区二区三区美图| 芒果影院网站在线观看| 做暖免费观看日本| 老女老肥熟国产在线视频| 中文字幕一区在线观看视频| 口内射精颜射极品合集| 3D动漫网站HOXXXxes| 女教师公车痴汉在线播放| japanesematur乱儿| 日本激情网址| 国产av在在免费线观看美女| 四虎影视库永久免费| 国产精品日本欧美一区二区 | 国产成人啪精品视频免费网| 色久久一个亚洲综合网| 国产电影无码午夜在线播放| 亚洲 欧美 国产 综合五月天| 国外成人电台| 有人有片的观看免费视频| 免费国产精品视频| 把腿张开老子CAO烂你动态图| 肉肉高潮液体高干文H| 国产学生无码中文视频一区| 亚洲伊人久久大香线蕉综合图片| 久久久国产精品免费A片蜜臀| 2021国产精品国产精华| 人人碰79免费视频| 国产香蕉尹人视频在线| 曰本少妇高潮久久久久久| 欧美性xxxxxx爱| 国产女人91精品嗷嗷嗷嗷|