自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

HarmonyOS編程跨設(shè)備跳轉(zhuǎn) | Java注釋版

開發(fā) 后端 OpenHarmony
文章由鴻蒙社區(qū)產(chǎn)出,想要了解更多內(nèi)容請前往:51CTO和華為官方戰(zhàn)略合作共建的鴻蒙技術(shù)社區(qū)https://harmonyos.51cto.com

[[407016]]

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

前言

這里有HarmonyOS文檔學(xué)習(xí) | 分布式任務(wù)調(diào)度 | 思維導(dǎo)圖,是關(guān)于文檔部分的思維導(dǎo)圖,跨設(shè)備調(diào)用也是用到里面的知識

本文章只是說明書,是代碼的補(bǔ)充部分。不建議僅根據(jù)該文進(jìn)行實踐

正確的做法是下載附件中的源碼,對照源碼和文章的步驟,進(jìn)行實踐復(fù)現(xiàn)

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

三種跨設(shè)備跳轉(zhuǎn)的區(qū)別

只把頁面內(nèi)容遷移過去

把編輯中的內(nèi)容遷移過去,支持雙向控制

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

正文

1. 實現(xiàn)步驟

跨設(shè)備調(diào)用屬于不同頁面跳轉(zhuǎn),所以要有兩個以上的Ability

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

HarmonyOS編程 | 跨設(shè)備跳轉(zhuǎn) | Java注釋版-鴻蒙HarmonyOS技術(shù)社區(qū)

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

第三步:編寫業(yè)務(wù)邏輯代碼

1. 聲明權(quán)限

因為涉及到跨設(shè)備調(diào)度,所以為了安全,需要獲取權(quán)限才能進(jìn)行交互

聲明獲取設(shè)備列表即設(shè)備信息的權(quán)限

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.     } 

注意:

第三方應(yīng)用使用: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.       // 為第三方應(yīng)用權(quán)限的主動聲明 
  8.       requestPermissionsFromUser(new String[] {"ohos.permission.DISTRIBUTED_DATASYNC"}, 0); 
  9.    } 

2. 獲取設(shè)備Id

只有拿到設(shè)備Id,跳轉(zhuǎn)的時候才會根據(jù)Id進(jìn)行頁面遷移

3. 實現(xiàn)遷移功能代碼

……

補(bǔ)充模擬器如何分布式跨設(shè)備測試:

如何多開模擬器,進(jìn)行分布式應(yīng)用開發(fā)(在DES 2.1版本之前,只能用真機(jī)進(jìn)行分布式跨設(shè)備開發(fā))

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

HarmonyOS編程 | 跨設(shè)備跳轉(zhuǎn) | Java注釋版-鴻蒙HarmonyOS技術(shù)社區(qū)

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

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

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

HarmonyOS編程 | 跨設(shè)備跳轉(zhuǎn) | Java注釋版-鴻蒙HarmonyOS技術(shù)社區(qū)

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

2. 核心代碼部分

2.1. 只把頁面內(nèi)容遷移過去

MainAbilitySlice.java

  1. // 通過組件id獲得組件 
  2. btn1 = (Button)findComponentById(ResourceTable.Id_migration_btn_01); 
  3. // 設(shè)置按鈕的點擊監(jiān)聽事件 
  4. btn1.setClickedListener(component -> { 
  5.     // 要實現(xiàn)跨設(shè)備的打開FA 
  6.     // 第一步當(dāng)然就是要獲取到設(shè)備id 
  7.  
  8.     // 通過設(shè)備管理的獲得設(shè)備列表方法獲得 
  9.     List<DeviceInfo> deviceList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE); 
  10.     // 判空 
  11.     if (deviceList.isEmpty()) { 
  12.         return null
  13.     } 
  14.     // 獲得設(shè)備數(shù)量 
  15.     int deviceNum = deviceList.size(); 
  16.     // 創(chuàng)建兩個列表,分別存設(shè)備id和設(shè)備名 
  17.     ArrayList<String> deviceIds = new ArrayList<>(deviceNum); 
  18.     ArrayList<String> deviceNames = new ArrayList<>(deviceNum); 
  19.     // 遍歷設(shè)備列表,將設(shè)備id和設(shè)備名分別存到兩個列表中 
  20.     deviceList.forEach(device -> { 
  21.         deviceIds.add(device.getDeviceId()); 
  22.         deviceNames.add(device.getDeviceName()); 
  23.     }); 
  24.  
  25.     // 我就直接使用deviceIds的第一個元素,作為啟動遠(yuǎn)程設(shè)備的目標(biāo)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) // 獲得設(shè)備id,在本地的時候可以為空 
  34.             .withBundleName("com.anzia.study_2")    // 包名,在config.json中可找到 
  35.             .withAbilityName("com.anzia.study_2.RemoteAbility") // 設(shè)立目標(biāo)頁面,一定要路徑名!??! 
  36.             .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)   // 設(shè)立標(biāo)簽,允許跨設(shè)備 
  37.             .build();   // 構(gòu)建 
  38.  
  39.         btn_1_intent.setOperation(operation);   // 把operation存進(jìn)intent中 
  40.  
  41.         startAbility(btn_1_intent); 
  42.     } 
  43.  
  44. }); 

測試結(jié)果:

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

安裝好后會提示用戶獲取權(quán)限,獲得權(quán)限才能獲取設(shè)備Id,從而進(jìn)行跨設(shè)備頁面跳轉(zhuǎn)

HarmonyOS編程 | 跨設(shè)備跳轉(zhuǎn) | Java注釋版-鴻蒙HarmonyOS技術(shù)社區(qū)

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

HarmonyOS編程 | 跨設(shè)備跳轉(zhuǎn) | Java注釋版-鴻蒙HarmonyOS技術(shù)社區(qū)

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

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

如果要獲取設(shè)備Id,只需要實現(xiàn)這個工具類即可

DeviceUtils.java

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

在MainAbilitySlice.java中實現(xiàn)可交互的頁面跳轉(zhuǎn)

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

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

要把編輯中的文字遷移到其他設(shè)備,需要對目標(biāo)Ability和Slice實現(xiàn)IAbilityContinuation接口,并把構(gòu)造方法設(shè)置為true

MigrationAbility.java

HarmonyOS編程 | 跨設(shè)備跳轉(zhuǎn) | Java注釋版-鴻蒙HarmonyOS技術(shù)社區(qū)

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.       // 默認(rèn)為空 
  15.       textField.setText(tfStr); 
  16.  
  17.       mgBtn = (Button) findComponentById(ResourceTable.Id_migration_button); 
  18.       mgBtn.setClickedListener(component -> { 
  19.          // 核心代碼,點擊按鈕,實現(xiàn)FA的遷移 
  20.          // 第一步獲取設(shè)備id 
  21.          String deviceId = DeviceUtils.getDeviceId(); 
  22.          if (deviceId != null) { 
  23.             // 實現(xiàn)設(shè)備遷移 
  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.    // 保持?jǐn)?shù)據(jù) 
  47.    public boolean onSaveData(IntentParams intentParams) { 
  48.       // 獲得文本框中的文字,并保存到data中,鍵值對形式 
  49.       intentParams.setParam("data", textField.getText()); 
  50.       return true
  51.    } 
  52.  
  53.    @Override 
  54.    // 恢復(fù)數(shù)據(jù) 
  55.    public boolean onRestoreData(IntentParams intentParams) { 
  56.       // 在其他設(shè)備恢復(fù)數(shù)據(jù)時,從data讀取內(nèi)容 
  57.       tfStr = intentParams.getParam("data").toString(); 
  58.       return true
  59.    } 
  60.  
  61.    @Override 
  62.    public void onCompleteContinuation(int i) { 
  63.  
  64.    } 

測試結(jié)果

點擊按鈕進(jìn)入MigrationAbility頁面,在輸入框中輸入文本內(nèi)容,再點擊按鈕,可以看到已經(jīng)遷移過去了

在目標(biāo)設(shè)備上添加新的內(nèi)容,再按點擊遷移,可以對源設(shè)備的內(nèi)容進(jìn)行修改。即,可以雙向控制

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

實現(xiàn)方式和上面的基本差不多,也要實現(xiàn)IAbilityContinuation接口,在部分細(xì)節(jié)不同

不同點:

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

2. 在Slice中

跨設(shè)備的方法由continueAbility()變?yōu)閏ontinueAbilityReversibly()

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

MigrationBackAbilitySlice.java

HarmonyOS編程 | 跨設(shè)備跳轉(zhuǎn) | Java注釋版-鴻蒙HarmonyOS技術(shù)社區(qū)

測試結(jié)果:

在文本框輸入數(shù)據(jù)后,點擊遷移按鈕,就可以在目標(biāo)設(shè)備喚起應(yīng)用了。點擊撤回按鈕,也可以把目標(biāo)設(shè)備的頁面撤回

這個操作是單向的,不能再遷移后,對目標(biāo)設(shè)備內(nèi)容修改再點擊遷移修改源設(shè)備內(nèi)容。這樣做會閃退

3. 總結(jié)

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

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

在簡單的跨設(shè)備調(diào)用,可以使用OperationBuilder()方法即可

要將設(shè)備編輯中的內(nèi)容跨設(shè)備的話,需要為目標(biāo)頁面的Ability和Slice實現(xiàn)IAbilityContinuation()接口,使用new ElementName()

使用continueAbility進(jìn)行雙向交互

使用continueAbilityReversibly()和reverseContinueAbility()進(jìn)行單向跨設(shè)備跳轉(zhuǎn)及撤回內(nèi)容

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-06-22 16:40:32

鴻蒙HarmonyOS應(yīng)用

2020-11-05 10:05:25

App

2021-06-16 15:18:03

鴻蒙HarmonyOS應(yīng)用

2021-01-06 10:59:14

鴻蒙HarmonyOSPage Abilit

2021-07-08 09:42:04

鴻蒙HarmonyOS應(yīng)用

2021-01-06 11:21:56

鴻蒙HarmonyOS應(yīng)用開發(fā)

2021-03-23 09:52:39

鴻蒙HarmonyOS應(yīng)用開發(fā)

2021-10-28 14:48:46

鴻蒙HarmonyOS應(yīng)用

2021-03-29 09:59:09

鴻蒙HarmonyOS應(yīng)用開發(fā)

2011-04-07 10:50:47

數(shù)據(jù)庫編程注釋規(guī)范

2022-10-11 15:26:16

網(wǎng)絡(luò)編程鴻蒙

2015-03-17 09:59:41

跨平臺

2021-12-21 09:56:47

鴻蒙HarmonyOS應(yīng)用

2014-06-26 11:09:13

2020-11-24 11:58:19

HarmonyOS

2021-06-30 14:29:56

GitHub 編程工具AI

2014-12-11 11:03:20

Qt跨平臺開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號