成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HarmonyOS編程跨設備跳轉 | Java注釋版

開發 后端 OpenHarmony
文章由鴻蒙社區產出,想要了解更多內容請前往:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com

[[407016]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

前言

這里有HarmonyOS文檔學習 | 分布式任務調度 | 思維導圖,是關于文檔部分的思維導圖,跨設備調用也是用到里面的知識

本文章只是說明書,是代碼的補充部分。不建議僅根據該文進行實踐

正確的做法是下載附件中的源碼,對照源碼和文章的步驟,進行實踐復現

跨設備跳轉是頁面跳轉的進階版,如果頁面跳轉還不熟悉,可以在我的第一彈中練習。在安卓中由于沒有跨設備的接口,所以要實現都需要自己寫。而在鴻蒙中,只需要用一兩行代碼就能實現跨設備的的核心操作

三種跨設備跳轉的區別

只把頁面內容遷移過去

把編輯中的內容遷移過去,支持雙向控制

把編輯中的內容遷移過去,并可撤回遷移,僅支持單向控制

正文

1. 實現步驟

跨設備調用屬于不同頁面跳轉,所以要有兩個以上的Ability

第一步:創建多個Ability,創建后,會在slice、layout和graphic中自動生成對應的文件

HarmonyOS編程 | 跨設備跳轉 | Java注釋版-鴻蒙HarmonyOS技術社區

第二步:編寫xml布局文件,這里只是簡單的示例,所以就只有簡單的內容

第三步:編寫業務邏輯代碼

1. 聲明權限

因為涉及到跨設備調度,所以為了安全,需要獲取權限才能進行交互

聲明獲取設備列表即設備信息的權限

config.json

  1. "reqPermissions": [ 
  2.     { 
  3.         "name""ohos.permission.DISTRIBUTED_DATASYNC" 
  4.     }, 
  5.     { 
  6.         "name""ohos.permission.GET_BUNDLE_INFO" 
  7.     }, 
  8.     { 
  9.         "name""ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE" 
  10.     }, 
  11.     { 
  12.         "name""ohos.permission.GET_DISTRIBUTED_DEVICE_INFO" 
  13.     } 

注意:

第三方應用使用:ohos.permission.DISTRIBUTED_DATASYNC

還需要在主Ability代碼中顯式聲明

  1. public class MainAbility extends Ability { 
  2.    @Override 
  3.    public void onStart(Intent intent) { 
  4.       super.onStart(intent); 
  5.       super.setMainRoute(MainAbilitySlice.class.getName()); 
  6.  
  7.       // 為第三方應用權限的主動聲明 
  8.       requestPermissionsFromUser(new String[] {"ohos.permission.DISTRIBUTED_DATASYNC"}, 0); 
  9.    } 

2. 獲取設備Id

只有拿到設備Id,跳轉的時候才會根據Id進行頁面遷移

3. 實現遷移功能代碼

……

補充模擬器如何分布式跨設備測試:

如何多開模擬器,進行分布式應用開發(在DES 2.1版本之前,只能用真機進行分布式跨設備開發)

1. 先確保自己DES版本是2.1以上,可以通過 Help > Check for Updates 進行更新

HarmonyOS編程 | 跨設備跳轉 | Java注釋版-鴻蒙HarmonyOS技術社區

2. 更新完之后也可以順便更新自己的 SDK 和 Previewer (Previewer這個挺好用的,寫完布局可直接預覽而不用開模擬器)

3. 點擊 SDK Platforms 和 SDK Tools 查看,在這里我都更新了,反正內存多~

4. 都更新完之后,可以去 File > Settings 或者按 Ctrl + Alt + S 快捷鍵進入設置面板,點擊 DevEco Labs,勾選 Enable Super Device(其他也可以勾選,Java Previewr賊好用,在寫完xml布局文件后,點擊最右邊導航欄或者按 Alt + 3 就可以預覽了)

HarmonyOS編程 | 跨設備跳轉 | Java注釋版-鴻蒙HarmonyOS技術社區

5. 然后就可以看到模擬器上多了 Super Device

2. 核心代碼部分

2.1. 只把頁面內容遷移過去

MainAbilitySlice.java

  1. // 通過組件id獲得組件 
  2. btn1 = (Button)findComponentById(ResourceTable.Id_migration_btn_01); 
  3. // 設置按鈕的點擊監聽事件 
  4. btn1.setClickedListener(component -> { 
  5.     // 要實現跨設備的打開FA 
  6.     // 第一步當然就是要獲取到設備id 
  7.  
  8.     // 通過設備管理的獲得設備列表方法獲得 
  9.     List<DeviceInfo> deviceList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE); 
  10.     // 判空 
  11.     if (deviceList.isEmpty()) { 
  12.         return null
  13.     } 
  14.     // 獲得設備數量 
  15.     int deviceNum = deviceList.size(); 
  16.     // 創建兩個列表,分別存設備id和設備名 
  17.     ArrayList<String> deviceIds = new ArrayList<>(deviceNum); 
  18.     ArrayList<String> deviceNames = new ArrayList<>(deviceNum); 
  19.     // 遍歷設備列表,將設備id和設備名分別存到兩個列表中 
  20.     deviceList.forEach(device -> { 
  21.         deviceIds.add(device.getDeviceId()); 
  22.         deviceNames.add(device.getDeviceName()); 
  23.     }); 
  24.  
  25.     // 我就直接使用deviceIds的第一個元素,作為啟動遠程設備的目標id 
  26.     String deviceId = deviceIds.get(0); 
  27.  
  28.     if (deviceId != null) { 
  29.         // 新建Intent,意圖:信息的載體 
  30.         Intent btn_1_intent = new Intent(); 
  31.         // OperationBuilder()方式 
  32.         Operation operation = new Intent.OperationBuilder() 
  33.             .withDeviceId(deviceId) // 獲得設備id,在本地的時候可以為空 
  34.             .withBundleName("com.anzia.study_2")    // 包名,在config.json中可找到 
  35.             .withAbilityName("com.anzia.study_2.RemoteAbility") // 設立目標頁面,一定要路徑名!!! 
  36.             .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)   // 設立標簽,允許跨設備 
  37.             .build();   // 構建 
  38.  
  39.         btn_1_intent.setOperation(operation);   // 把operation存進intent中 
  40.  
  41.         startAbility(btn_1_intent); 
  42.     } 
  43.  
  44. }); 

測試結果:

這里用的是模擬器,項目要在兩個模擬上都進行打包安裝

安裝好后會提示用戶獲取權限,獲得權限才能獲取設備Id,從而進行跨設備頁面跳轉

HarmonyOS編程 | 跨設備跳轉 | Java注釋版-鴻蒙HarmonyOS技術社區

點擊第一個按鈕,即可看到另一設備啟動

HarmonyOS編程 | 跨設備跳轉 | Java注釋版-鴻蒙HarmonyOS技術社區

2.2. 把編輯中的內容遷移過去,支持雙向控制

由于獲取設備Id的這部分代碼經常使用,所以可以把這部分封裝為一個工具類

如果要獲取設備Id,只需要實現這個工具類即可

DeviceUtils.java

  1. public class DeviceUtils { 
  2.    public static String getDeviceId() { 
  3.       // 通過設備管理的獲得設備列表方法獲得 
  4.       List<DeviceInfo> deviceList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE); 
  5.       // 判空 
  6.       if (deviceList.isEmpty()) { 
  7.          return null
  8.       } 
  9.       // 獲得設備數量 
  10.       int deviceNum = deviceList.size(); 
  11.       // 創建兩個列表,分別存設備id和設備名 
  12.       ArrayList<String> deviceIds = new ArrayList<>(deviceNum); 
  13.       ArrayList<String> deviceNames = new ArrayList<>(deviceNum); 
  14.       // 遍歷設備列表,將設備id和設備名分別存到兩個列表中 
  15.       deviceList.forEach(device -> { 
  16.          deviceIds.add(device.getDeviceId()); 
  17.          deviceNames.add(device.getDeviceName()); 
  18.       }); 
  19.  
  20.       // 我就直接使用deviceIds的第一個元素,作為啟動遠程設備的目標id 
  21.       String deviceIdStr = deviceIds.get(0); 
  22.       return deviceIdStr; 
  23.    } 

在MainAbilitySlice.java中實現可交互的頁面跳轉

使用new ElementName()設備模板頁面路徑

  1. btn2 = (Button)findComponentById(ResourceTable.Id_migration_btn_02); 
  2. btn2.setClickedListener(component -> { 
  3.    Intent btn_2_intent = new Intent(); 
  4.    ElementName migrationSliceEn = new ElementName("""com.anzia.study_2""MigrationAbility"); 
  5.    btn_2_intent.setElement(migrationSliceEn); 
  6.    startAbility(btn_2_intent); 
  7. }); 

要把編輯中的文字遷移到其他設備,需要對目標Ability和Slice實現IAbilityContinuation接口,并把構造方法設置為true

MigrationAbility.java

HarmonyOS編程 | 跨設備跳轉 | Java注釋版-鴻蒙HarmonyOS技術社區

MigrationAbilitySlice.java

  1. public class MigrationAbilitySlice extends AbilitySlice implements IAbilityContinuation { 
  2.  
  3.    private TextField textField; 
  4.    private Button mgBtn; 
  5.    private String tfStr = ""
  6.  
  7.    @Override 
  8.    public void onStart(Intent intent) { 
  9.       super.onStart(intent); 
  10.       super.setUIContent(ResourceTable.Layout_ability_migration); 
  11.  
  12.       // 編輯的文字 
  13.       textField = (TextField) findComponentById(ResourceTable.Id_textfield_migration); 
  14.       // 默認為空 
  15.       textField.setText(tfStr); 
  16.  
  17.       mgBtn = (Button) findComponentById(ResourceTable.Id_migration_button); 
  18.       mgBtn.setClickedListener(component -> { 
  19.          // 核心代碼,點擊按鈕,實現FA的遷移 
  20.          // 第一步獲取設備id 
  21.          String deviceId = DeviceUtils.getDeviceId(); 
  22.          if (deviceId != null) { 
  23.             // 實現設備遷移 
  24.             continueAbility(deviceId); 
  25.          } 
  26.       }); 
  27.  
  28.    } 
  29.  
  30.    @Override 
  31.    public void onActive() { 
  32.       super.onActive(); 
  33.    } 
  34.  
  35.    @Override 
  36.    public void onForeground(Intent intent) { 
  37.       super.onForeground(intent); 
  38.    } 
  39.  
  40.    @Override 
  41.    public boolean onStartContinuation() { 
  42.       return true
  43.    } 
  44.  
  45.    @Override 
  46.    // 保持數據 
  47.    public boolean onSaveData(IntentParams intentParams) { 
  48.       // 獲得文本框中的文字,并保存到data中,鍵值對形式 
  49.       intentParams.setParam("data", textField.getText()); 
  50.       return true
  51.    } 
  52.  
  53.    @Override 
  54.    // 恢復數據 
  55.    public boolean onRestoreData(IntentParams intentParams) { 
  56.       // 在其他設備恢復數據時,從data讀取內容 
  57.       tfStr = intentParams.getParam("data").toString(); 
  58.       return true
  59.    } 
  60.  
  61.    @Override 
  62.    public void onCompleteContinuation(int i) { 
  63.  
  64.    } 

測試結果

點擊按鈕進入MigrationAbility頁面,在輸入框中輸入文本內容,再點擊按鈕,可以看到已經遷移過去了

在目標設備上添加新的內容,再按點擊遷移,可以對源設備的內容進行修改。即,可以雙向控制

2.3. 把編輯中的內容遷移過去,并可撤回遷移,僅支持單向控制

實現方式和上面的基本差不多,也要實現IAbilityContinuation接口,在部分細節不同

不同點:

1. 在頁面中多了一個回遷的按鈕

2. 在Slice中

跨設備的方法由continueAbility()變為continueAbilityReversibly()

撤回遷移使用的方法是reverseContinueAbility()

MigrationBackAbilitySlice.java

HarmonyOS編程 | 跨設備跳轉 | Java注釋版-鴻蒙HarmonyOS技術社區

測試結果:

在文本框輸入數據后,點擊遷移按鈕,就可以在目標設備喚起應用了。點擊撤回按鈕,也可以把目標設備的頁面撤回

這個操作是單向的,不能再遷移后,對目標設備內容修改再點擊遷移修改源設備內容。這樣做會閃退

3. 總結

因為涉及到設備之間的流轉,涉及到安全,所以要在config.json中聲明權限。如果想利用第三方設備,除了要在config.json中聲明,還需要在代碼中顯式聲明

跨設備需要獲取設備Id,如果多個Slice中都要獲取設備Id,那么可以將獲取設備Id的這個步驟封裝為一個工具類

在簡單的跨設備調用,可以使用OperationBuilder()方法即可

要將設備編輯中的內容跨設備的話,需要為目標頁面的Ability和Slice實現IAbilityContinuation()接口,使用new ElementName()

使用continueAbility進行雙向交互

使用continueAbilityReversibly()和reverseContinueAbility()進行單向跨設備跳轉及撤回內容

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-06-22 16:40:32

鴻蒙HarmonyOS應用

2020-11-05 10:05:25

App

2021-06-16 15:18:03

鴻蒙HarmonyOS應用

2021-01-06 10:59:14

鴻蒙HarmonyOSPage Abilit

2021-07-08 09:42:04

鴻蒙HarmonyOS應用

2021-10-28 14:48:46

鴻蒙HarmonyOS應用

2021-01-06 11:21:56

鴻蒙HarmonyOS應用開發

2022-10-11 15:26:16

網絡編程鴻蒙

2015-03-17 09:59:41

跨平臺

2011-04-07 10:50:47

數據庫編程注釋規范

2021-03-23 09:52:39

鴻蒙HarmonyOS應用開發

2021-03-29 09:59:09

鴻蒙HarmonyOS應用開發

2020-11-24 11:58:19

HarmonyOS

2021-12-21 09:56:47

鴻蒙HarmonyOS應用

2014-06-26 11:09:13

2020-11-25 11:42:15

HarmonyOS

2020-11-13 12:09:46

HarmonyOS
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品一区在线播放 | 欧美成人h版在线观看 | 国产欧美一区二区三区在线看 | 二区不卡| 日韩精品一区二区三区四区视频 | 欧美日韩大片 | a级毛片免费高清视频 | 91九色婷婷 | 日本福利在线 | 国产精品亚洲综合 | 国产午夜精品一区二区三区四区 | 国产精品视频免费看 | 99re国产 | 精品亚洲一区二区三区四区五区高 | 久久毛片网站 | 国产精品一二三区 | 国产精品不卡一区 | 欧美日韩一区在线观看 | 日韩视频在线免费观看 | 国内精品久久久久久久 | 在线观看av中文字幕 | 亚洲精品一区二区在线观看 | 午夜专区 | 国产精品综合久久 | 国产精品久久久久久亚洲调教 | 亚洲精品免费视频 | 欧美性成人 | 日韩精品成人免费观看视频 | 久久看精品 | 久久日本| 亚洲国产成人精品一区二区 | 国产区一区二区三区 | 日韩电影一区二区三区 | 国产成人精品a视频一区www | 一级欧美 | 色综合天天天天做夜夜夜夜做 | 国产中文字幕在线 | 夜夜艹| 欧美另类视频 | 午夜影院在线播放 | 精品福利一区二区三区 |