精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

HarmonyOS Sample 之 Pasteboard 分布式粘貼板

開發 分布式 OpenHarmony
HarmonyOS提供系統剪貼板服務的操作接口,支持用戶程序從系統剪貼板中讀取、寫入和查詢剪貼板數據,以及添加、移除系統剪貼板數據變化的回調。

[[435097]]

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

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

https://harmonyos.51cto.com

一、介紹

HarmonyOS提供系統剪貼板服務的操作接口,支持用戶程序從系統剪貼板中讀取、寫入和查詢剪貼板數據,以及添加、移除系統剪貼板數據變化的回調。

設備內:

用戶通過系統剪貼板服務,可實現應用之間的簡單數據傳遞。例如:在應用A中復制的數據,可以在應用B中粘貼,反之亦可。

設備間:

在分布式粘貼板場景中,粘貼的數據可以跨設備寫入。例如,設備A上的應用程序使用系統粘貼板接口將從設備A復制的數據通過IDL接口存儲到設備B的系統粘貼板中。如果數據允許,設備B上的應用程序可以讀取并粘貼系統粘貼板中的復制數據。實現設備之間粘貼板的分布式協同。

基于以上理解,實現一個分布式粘貼板應用程序,應用程序分為客戶端(copy)和服務端(paste)兩部分,通過idl實現數據傳遞。

客戶端負責數據采集,服務端負責數據的展示和應用,客戶端和服務端可以安裝在同一臺設備中,也可以安裝在不同的設備中,服務端也可以按照在多臺設備中,服務端通過分布式數據庫實現粘貼板數據的自動同步。

二、效果展示

HarmonyOS Sample 之 Pasteboard 分布式粘貼板-鴻蒙HarmonyOS技術社區
HarmonyOS Sample 之 Pasteboard 分布式粘貼板-鴻蒙HarmonyOS技術社區

三、搭建環境

安裝DevEco Studio,詳情請參考DevEco Studio下載

設置DevEco Studio開發環境,DevEco Studio開發環境需要依賴于網絡環境,需要連接上網絡才能確保工具的正常使用,可以根據如下兩種情況來配置開發環境:

如果可以直接訪問Internet,只需進行下載HarmonyOS SDK操作。

如果網絡不能直接訪問Internet,需要通過代理服務器才可以訪問,請參考配置開發環境

下載源碼后,使用DevEco Studio 打開項目,模擬器運行即可。

真機運行需要將config.json中的buddleName修改為自己的,如果沒有請到AGC上進行配置,參見 使用模擬器進行調試

四、項目結構

HarmonyOS Sample 之 Pasteboard 分布式粘貼板-鴻蒙HarmonyOS技術社區
HarmonyOS Sample 之 Pasteboard 分布式粘貼板-鴻蒙HarmonyOS技術社區

五、代碼講解

5.1 系統粘貼板基礎功能介紹

系統粘貼板對象介紹

1.SystemPasteboard //系統粘貼板對象,定義系統粘貼板操作,包括復制、粘貼和設置粘貼板內容更改的偵聽器。

2.PasteData//表示粘貼板上的粘貼數據。

3.PasteData.DataProperty //該類定義了系統粘貼板上 PasteData 的屬性,包括時間戳、MIME 類型和其他屬性數據。

4.PasteData.Record//該類將單個粘貼的數據定義為 Record,它可以是純文本、HTML 文本、URI 和意圖。 PasteData 對象包含一個或多個記錄。

客戶端(copy)CopyAbilitySlice.java

獲取系統粘貼板,監聽粘貼板數據變化

  1. /** 
  2.  * 獲取系統粘貼板 
  3.  * 監聽粘貼板數據變化 
  4.  */ 
  5. private void initPasteboard() { 
  6.     HiLog.debug(LABEL, "initPasteboard"); 
  7.     //獲取系統粘貼板對象 
  8.     pasteboard = SystemPasteboard.getSystemPasteboard(this); 
  9.     //監聽粘貼板數據變化 
  10.     pasteboard.addPasteDataChangedListener(() -> { 
  11.         if (pasteboard.hasPasteData()) { 
  12.             sync_text = getPasteData(); 
  13.             HiLog.debug(LABEL, "%{public}s""pasteStr:" + sync_text); 
  14.         } 
  15.     }); 

獲取粘貼板內容

  1. /** 
  2.  * 獲取粘貼板記錄 
  3.  * 
  4.  * @return 
  5.  */ 
  6. private String getPasteData() { 
  7.     HiLog.debug(LABEL, "getPasteData"); 
  8.     String result = ""
  9.  
  10.     //粘貼板數據對象 
  11.     PasteData pasteData = pasteboard.getPasteData(); 
  12.     if (pasteData == null) { 
  13.         return result; 
  14.     } 
  15.     PasteData.DataProperty dataProperty = pasteData.getProperty(); 
  16.     // 
  17.     boolean hasHtml = dataProperty.hasMimeType(PasteData.MIMETYPE_TEXT_HTML); 
  18.     boolean hasText = dataProperty.hasMimeType(PasteData.MIMETYPE_TEXT_PLAIN); 
  19.  
  20.     //數據格式類型 
  21.     if (hasHtml || hasText) { 
  22.         for (int i = 0; i < pasteData.getRecordCount(); i++) { 
  23.             //粘貼板數據記錄 
  24.             PasteData.Record record = pasteData.getRecordAt(i); 
  25.             //不同類型獲取方式不同 
  26.             String mimeType = record.getMimeType(); 
  27.             //HTML文本 
  28.             if (mimeType.equals(PasteData.MIMETYPE_TEXT_HTML)) { 
  29.                 result = record.getHtmlText(); 
  30.                 //純文本 
  31.             } else if (mimeType.equals(PasteData.MIMETYPE_TEXT_PLAIN)) { 
  32.                 result = record.getPlainText().toString(); 
  33.                 // 
  34.             } else { 
  35.                 HiLog.info(LABEL, "%{public}s""getPasteData mimeType :" + mimeType); 
  36.             } 
  37.         } 
  38.     } 
  39.     return result; 

設置文本到粘貼板中

  1. /** 
  2.  * 設置文本到粘貼板 
  3.  * 
  4.  * @param component 
  5.  */ 
  6. private void setTextToPaste(Component component) { 
  7.     HiLog.info(LABEL, "setTextToPaste"); 
  8.     if (pasteboard != null) { 
  9.         String text = syncText.getText(); 
  10.         if (text.isEmpty()) { 
  11.             showTips(this, "請填寫內容"); 
  12.             return
  13.         } 
  14.         //把記錄添加到粘貼板 
  15.         PasteData pasteData=  PasteData.creatPlainTextData(text); 
  16.         //設置文本到粘貼板 
  17.         pasteboard.setPasteData(pasteData); 
  18.  
  19.         showTips(this, "復制成功"); 
  20.         HiLog.info(LABEL, "setTextToPaste succeeded"); 
  21.     } 

清空粘貼板

  1. /** 
  2.  * 清空粘貼板 
  3.  * 
  4.  * @param component 
  5.  */ 
  6. private void clearPasteboard(Component component) { 
  7.     if (pasteboard != null) { 
  8.         pasteboard.clear(); 
  9.         showTips(this, "Clear succeeded"); 
  10.     } 

5.2 分布式粘貼板應用構建思路介紹

HarmonyOS Sample 之 Pasteboard 分布式粘貼板-鴻蒙HarmonyOS技術社區

選擇遠端連接設備

本實例是通過新增加一個DevicesSelectAbility來實現的。

  1. private void showDevicesDialog() { 
  2.     Intent intent = new Intent(); 
  3.     //打開選擇設備的Ability頁面DevicesSelectAbility 
  4.     Operation operation = 
  5.             new Intent.OperationBuilder() 
  6.                     .withDeviceId(""
  7.                     .withBundleName(getBundleName()) 
  8.                     .withAbilityName(DevicesSelectAbility.class) 
  9.                     .build(); 
  10.     intent.setOperation(operation); 
  11.     //攜帶一個設備選擇請求標識,打開設備選擇頁面(DevicesSelectAbility) TODO 
  12.     startAbilityForResult(intent, Constants.PRESENT_SELECT_DEVICES_REQUEST_CODE); 
  13.  
  14. /** 
  15.  * 打開設備選擇Ability后,選擇連接的設備執行setResult后觸發 
  16.  * 
  17.  * @param requestCode 
  18.  * @param resultCode 
  19.  * @param resultIntent 
  20.  */ 
  21. @Override 
  22. protected void onAbilityResult(int requestCode, int resultCode, Intent resultIntent) { 
  23.     HiLog.debug(LABEL, "onAbilityResult"); 
  24.     if (requestCode == Constants.PRESENT_SELECT_DEVICES_REQUEST_CODE && resultIntent != null) { 
  25.         //獲取用戶選擇的設備 
  26.         String devicesId = resultIntent.getStringParam(Constants.PARAM_DEVICE_ID); 
  27.         //連接粘貼板服務端 
  28.         connectService(devicesId); 
  29.         return
  30.     } 

連接粘貼板服務端ServiceAbility服務

idl文件放在ohos.samples.pasteboard.paste目錄下,Gradl窗口,執行compileDebugIdl 后,系統生成代理對象。

  1. interface ohos.samples.pasteboard.paste.ISharePasteAgent { 
  2.     /* 
  3.      * 設置系統粘貼板 
  4.      */ 
  5.     void setSystemPaste([in] String param); 

連接服務端ServiceAbility,如果組網中沒有其他設備就連接本地的服務端。

連接成功后,初始化idl的SharePasteAgentProxy代理,用于下一步的同步數據。

  1. //idl共享粘貼板代理 
  2. private SharePasteAgentProxy remoteAgentProxy; 
  3.  
  4. /** 
  5.  * 連接粘貼板服務中心 
  6.  */ 
  7. private void connectService(String deviceId) { 
  8.     HiLog.debug(LABEL, "%{public}s""connectService"); 
  9.     if (!isConnect) { 
  10.         boolean isConnectRemote = deviceId != null
  11.         //三元表達式,判斷連接本地還是遠端Service 
  12.         Intent intent = isConnectRemote 
  13.                 ? getRemoteServiceIntent(REMOTE_BUNDLE, REMOTE_SERVICE, deviceId) 
  14.                 : getLocalServiceIntent(REMOTE_BUNDLE, REMOTE_SERVICE); 
  15.  
  16.         HiLog.debug(LABEL, "%{public}s""intent:" + intent); 
  17.         //連接 Service 
  18.         connectAbility(intent, new IAbilityConnection() { 
  19.             @Override 
  20.             public void onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, int resultCode) { 
  21.                 //發個通知,Service 連接成功了 
  22.                 eventHandler.sendEvent(EVENT_ABILITY_CONNECT_DONE); 
  23.                 //初始化代理 
  24.                 remoteAgentProxy = new SharePasteAgentProxy(iRemoteObject); 
  25.                 HiLog.debug(LABEL, "%{public}s""remoteAgentProxy:" + remoteAgentProxy); 
  26.             } 
  27.  
  28.             @Override 
  29.             public void onAbilityDisconnectDone(ElementName elementName, int resultCode) { 
  30.                 //發個通知,Service 斷開連接了,主動斷開不會執行,關閉服務端會執行 
  31.                 eventHandler.sendEvent(EVENT_ABILITY_DISCONNECT_DONE); 
  32.             } 
  33.         }); 
  34.     } 
  35. /** 
  36.  * 獲取遠端粘貼板服務中心 
  37.  * 
  38.  * @param bundleName 
  39.  * @param serviceName 
  40.  * @return 
  41.  */ 
  42. private Intent getRemoteServiceIntent(String bundleName, String serviceName, String deviceId) { 
  43.     HiLog.debug(LABEL, "%{public}s""getRemoteServiceIntent"); 
  44.     Operation operation = new Intent.OperationBuilder() 
  45.             .withDeviceId(deviceId) 
  46.             .withBundleName(bundleName) 
  47.             .withAbilityName(serviceName) 
  48.             //重要 
  49.             .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE) 
  50.             .build(); 
  51.     Intent intent = new Intent(); 
  52.     intent.setOperation(operation); 
  53.     return intent; 
  54.  
  55. /** 
  56.  * 獲取本地粘貼板服務中心 
  57.  * 
  58.  * @param bundleName 
  59.  * @param serviceName 
  60.  * @return 
  61.  */ 
  62. private Intent getLocalServiceIntent(String bundleName, String serviceName) { 
  63.     HiLog.debug(LABEL, "%{public}s""getLocalServiceIntent"); 
  64.     Operation operation = new Intent.OperationBuilder().withDeviceId(""
  65.             .withBundleName(bundleName) 
  66.             .withAbilityName(serviceName) 
  67.             .build(); 
  68.     Intent intent = new Intent(); 
  69.     intent.setOperation(operation); 
  70.     return intent; 

同步數據到服務端

  1. /** 
  2.  * 同步粘貼板記錄到粘貼板服務中心 
  3.  * 
  4.  * @param component 
  5.  */ 
  6. private void syncData(Component component) { 
  7.     HiLog.debug(LABEL, "sync_text:" + sync_text); 
  8.     if (!sync_text.isEmpty()) { 
  9.         if (isConnect && remoteAgentProxy != null) { 
  10.             //調用服務端IPC方法 
  11.             try { 
  12.                 remoteAgentProxy.setSystemPaste(sync_text); 
  13.                 //更換文本 
  14.                 syncText.setText(getRandomText()); 
  15.                 sync_text = ""
  16.                 showTips(this, "同步成功"); 
  17.             } catch (RemoteException remoteException) { 
  18.                 remoteException.printStackTrace(); 
  19.             } 
  20.         } else { 
  21.             showTips(this, "正在連接設備"); 
  22.         } 
  23.     } else { 
  24.         showTips(this, "點擊復制到粘貼板"); 
  25.     } 

隨機生成粘貼文本

  1. /** 
  2.  * 隨機文本,模擬數據 
  3.  * 
  4.  * @return 
  5.  */ 
  6. public String getRandomText() { 
  7.     List<String> list = Arrays.asList( 
  8.             "快馬加鞭未下鞍,離天三尺三"
  9.             "我自橫刀向天笑,去留肝膽兩昆侖"
  10.             "飛流直下三千尺,疑是銀河落九天"
  11.             "君子求諸己,小人求諸人"
  12.             "吾日三省吾身:為人謀而不忠乎?與朋友交而不信乎?傳不習乎?"); 
  13.     int random = new SecureRandom().nextInt(list.size()); 
  14.     return list.get(random); 

服務端(paste)ServiceAbility.java

設置粘貼板服務

idl文件放在ohos.samples.pasteboard.paste目錄下,Gradl窗口,執行compileDebugIdl 后,系統生成代理對象,idl提供了setSystemPaste接口供遠端調用。

  1. interface ohos.samples.pasteboard.paste.ISharePasteAgent { 
  2.     /* 
  3.      * 設置系統粘貼板 
  4.      */ 
  5.     void setSystemPaste([in] String param); 
  1. //idl的服務端實現, 
  2. SharePasteAgentStub sharePasteAgentStub = new SharePasteAgentStub(DESCRIPTOR) { 
  3.     @Override 
  4.     public void setSystemPaste(String param) { 
  5.         HiLog.info(LABEL, "%{public}s""param:" + param); 
  6.  
  7.         //插入數據庫 
  8.         ItemChild itemChild = new ItemChild(); 
  9.         String currentTime = DateUtils.getCurrentDate("yyMMdd HH:mm:ss"); 
  10.         itemChild.setWriteTime(currentTime); 
  11.         itemChild.setWriteContent(param); 
  12.         itemChild.setIndex(String.valueOf(UUID.randomUUID())); 
  13.         //默認添加到未分類 
  14.         itemChild.setTagName(Const.CATEGORY_TAG_UNCATEGOORIZED); 
  15.         //添加粘貼板記錄到分布式數據庫 
  16.         kvManagerUtils.addItemChild(itemChild); 
  17.  
  18.     } 
  19. }; 
  20.  
  21. @Override 
  22. protected IRemoteObject onConnect(Intent intent) { 
  23.     HiLog.info(LABEL, "%{public}s""ServiceAbility onConnect"); 
  24.     return sharePasteAgentStub; 
  25.  
  26. **初始化數據庫** 
  27. ```java 
  28. //初始化數據庫工具 
  29. kvManagerUtils = KvManagerUtils.getInstance(this); 
  30.  
  31. //初始化數據庫管理對象 
  32. kvManagerUtils.initDbManager(eventHandler); 
  33.  
  34. //初始化數據庫數據按鈕 
  35. Image initDb = (Image) findComponentById(ResourceTable.Id_init_db); 
  36. initDb.setClickedListener(component -> { 
  37.     //默認選中“未定義”標簽 
  38.     current_select_category_index = 0; 
  39.     //初始化數據庫數據 
  40.     kvManagerUtils.initDbData(); 
  41.     showTip("初始化完成"); 
  42. }); 

初始化數據列表

  1. /** 
  2.  * 從分布式數據庫中查詢數據 
  3.  */ 
  4. public void queryData() { 
  5.     HiLog.debug(LABEL, "queryData"); 
  6.     try { 
  7.         //加載選中類別下的數據列表 
  8.         initItemChild(kvManagerUtils.queryDataByTag(CategoryData.tagList.get(current_select_category_index))); 
  9.     } catch (KvStoreException exception) { 
  10.         HiLog.info(LABEL, "the value must be String"); 
  11.     } 
  12.  
  13. /** 
  14.  * 初始化選中標簽的子項列表 
  15.  * 
  16.  * @param itemChildList itemChildList, the bean of itemChild 
  17.  */ 
  18. private void initItemChild(List<ItemChild> itemChildList) { 
  19.     HiLog.debug(LABEL, "initItemChild:" + itemChildList); 
  20.     if (itemChildList == null) { 
  21.         return
  22.     } 
  23.     //清空組件 
  24.     itemChildLayout.removeAllComponents(); 
  25.     // Create itemChild 
  26.     for (ItemChild itemChild : itemChildList) { 
  27.         //獲取子項類別所在的組件 
  28.         Component childComponent = 
  29.                 LayoutScatter.getInstance(this).parse(ResourceTable.Layout_paste_record_per, nullfalse); 
  30.         //寫入時間 
  31.         Text writeTime = (Text) childComponent.findComponentById(ResourceTable.Id_writeTime); 
  32.         writeTime.setText(itemChild.getWriteTime()); 
  33.         //粘貼板內容 
  34.         Text writeContent = (Text) childComponent.findComponentById(ResourceTable.Id_writeContent); 
  35.         writeContent.setText(itemChild.getWriteContent()); 
  36.  
  37.         //復制按鈕 
  38.         Text copy = (Text) childComponent.findComponentById(ResourceTable.Id_itemChildPerCopy); 
  39.         //復制按鈕的監聽事件 
  40.         copy.setClickedListener(component -> { 
  41.             //復制內容到粘貼板 
  42.             pasteboard.setPasteData(PasteData.creatPlainTextData(itemChild.getWriteContent())); 
  43.             showTip("已復制到粘貼板"); 
  44.         }); 
  45.  
  46.         //收藏按鈕 
  47.         Text favorite = (Text) childComponent.findComponentById(ResourceTable.Id_itemChildPerFavorite); 
  48.         //收藏按鈕的監聽事件 
  49.         favorite.setClickedListener(component -> { 
  50.             //修改標簽微已收藏 
  51.             itemChild.setTagName(Const.CATEGORY_TAG_FAVORITED); 
  52.             //保存數據 
  53.             kvManagerUtils.addItemChild(itemChild); 
  54.             showTip("已加入到收藏中"); 
  55.         }); 
  56.  
  57.  
  58.         /**************just for test********************/ 
  59.         //復選框 
  60.         Checkbox noteId = (Checkbox) childComponent.findComponentById(ResourceTable.Id_noteId); 
  61.         //子項列表的點擊事件 
  62.         childComponent.setClickedListener(component -> { 
  63.             if (noteId.getVisibility() == Component.VISIBLE) { 
  64.                 noteId.setChecked(!noteId.isChecked()); 
  65.             } 
  66.         }); 
  67.         //子項列表的長按事件,長按顯示復選框 
  68.         childComponent.setLongClickedListener(component -> { 
  69.             //checkbox顯示 
  70.             noteId.setVisibility(Component.VISIBLE); 
  71.             //設置復選框樣式,以及其他文本組件的縮進 
  72.             Element element = ElementScatter.getInstance(getContext()).parse(ResourceTable.Graphic_check_box_checked); 
  73.             noteId.setBackground(element); 
  74.             noteId.setChecked(true); 
  75.             writeTime.setMarginLeft(80); 
  76.             writeContent.setMarginLeft(80); 
  77.         }); 
  78.         //復選框的狀態變化監聽事件,state表示是否被選中 
  79.         noteId.setCheckedStateChangedListener((component, state) -> { 
  80.             // 狀態改變的邏輯 
  81.             Element element; 
  82.             if (state) { 
  83.                 //設置選中的樣式 
  84.                 element = ElementScatter.getInstance(getContext()) 
  85.                         .parse(ResourceTable.Graphic_check_box_checked); 
  86.             } else { 
  87.                 //設置未選中的樣式 
  88.                 element = ElementScatter.getInstance(getContext()) 
  89.                         .parse(ResourceTable.Graphic_check_box_uncheck); 
  90.             } 
  91.             noteId.setBackground(element); 
  92.         }); 
  93.         /**************just for test********************/ 
  94.  
  95.         //添加子項列表組件到布局 
  96.         itemChildLayout.addComponent(childComponent); 
  97.     } 

標簽分類顯示

  1. //初始化列表列表的點擊的監聽事件 
  2. categoryList.setItemClickedListener( 
  3.         (listContainer, component, index, l1) -> { 
  4.             //點的就是當前類別 
  5.             if (categoryListProvider.getSelectIndex() == index) { 
  6.                 return
  7.             } 
  8.             //切換類別索引 
  9.             categoryListProvider.setSelectIndex(index); 
  10.             //設置選中的標簽索引 
  11.             current_select_category_index = index
  12.             //獲取當前選中的標簽名稱 
  13.             String tagName = CategoryData.tagList.get(index); 
  14.             //從數據庫中查詢標簽子項列表 
  15.             initItemChild(kvManagerUtils.queryDataByTagAndKewWord(searchTextField.getText(), tagName)); 
  16.             //通知數據更新 
  17.             categoryListProvider.notifyDataChanged(); 
  18.             //滾動條到最頂部 
  19.             itemListScroll.fluentScrollYTo(0); 
  20.         }); 

搜索粘貼記錄

  1. //搜索key監聽事件 
  2. searchTextField.setKeyEventListener( 
  3.         (component, keyEvent) -> { 
  4.             if (keyEvent.isKeyDown() && keyEvent.getKeyCode() == KeyEvent.KEY_ENTER) { 
  5.                 //獲取當前選中的標簽名稱 
  6.                 String tagName = CategoryData.tagList.get(current_select_category_index); 
  7.                 List<ItemChild> itemChildList = kvManagerUtils.queryDataByTagAndKewWord(searchTextField.getText(), tagName); 
  8.                 //從數據庫中查詢標簽子項列表 
  9.                 initItemChild(itemChildList); 
  10.                 //通知數據更新 
  11.                 categoryListProvider.notifyDataChanged(); 
  12.                 //滾動條到最頂部 
  13.                 itemListScroll.fluentScrollYTo(0); 
  14.             } 
  15.             return false
  16.         }); 

分布式數據庫工具KvManagerUtils.java

數據變化通知

提供了分布式數據庫管理工具KvManagerUtils.java,數據庫操作都集中在這里了。

為了在數據庫數據發生變化時能及時更新頁面顯示,頁面在初始化數據庫時,傳遞eventHandler對象,這樣在數據庫變化是可以通知到頁面。

  1. /** 
  2.  * 訂閱數據庫更改通知 
  3.  * @param singleKvStore Data operation 
  4.  */ 
  5. private void subscribeDb(SingleKvStore singleKvStore) { 
  6.     HiLog.info(LABEL, "subscribeDb"); 
  7.     //數據庫觀察者客戶端 
  8.     KvStoreObserver kvStoreObserverClient = new KvStoreObserverClient(); 
  9.     //訂閱遠程數據更改 
  10.     singleKvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_REMOTE, kvStoreObserverClient); 
  11.  
  12. /** 
  13.  * 自定義分布式數據庫觀察者客戶端 
  14.  * 數據發生變化時觸發對應函數 
  15.  * Receive database messages 
  16.  */ 
  17. private class KvStoreObserverClient implements KvStoreObserver { 
  18.     @Override 
  19.     public void onChange(ChangeNotification notification) { 
  20.         HiLog.error(LABEL, "onChange"); 
  21.         eventHandler.sendEvent(Const.DB_CHANGE_MESS); 
  22.     } 

數據自動同步

默認開啟自動同步

  1. /** 
  2.  * Initializing Database Management 
  3.  * 初始化數據庫管理員 
  4.  */ 
  5. public void initDbManager(EventHandler eventHandler) { 
  6.     this.eventHandler = eventHandler; 
  7.     HiLog.info(LABEL, "initDbManager"); 
  8.     if (singleKvStore == null || kvManager == null) { 
  9.         HiLog.info(LABEL, "initDbData"); 
  10.         //創建數據庫管理員 
  11.         kvManager = createManager(); 
  12.         //創建數據庫 
  13.         singleKvStore = createDb(kvManager); 
  14.         subscribeDb(singleKvStore); 
  15.  
  16.     } 
  17.  
  18.  
  19.  
  20. /** 
  21.  * Create a distributed database manager instance 
  22.  * 創建數據庫管理員 
  23.  * 
  24.  * @return database manager 
  25.  */ 
  26. private KvManager createManager() { 
  27.     HiLog.info(LABEL, "createManager"); 
  28.     KvManager manager = null
  29.     try { 
  30.         // 
  31.         KvManagerConfig config = new KvManagerConfig(context); 
  32.         manager = KvManagerFactory.getInstance().createKvManager(config); 
  33.     } catch (KvStoreException exception) { 
  34.         HiLog.error(LABEL, "some exception happen"); 
  35.     } 
  36.     return manager; 
  37.  
  38. /** 
  39.  * Creating a Single-Version Distributed Database 
  40.  * 創建數據庫 
  41.  * 
  42.  * @param kvManager Database management 
  43.  * @return SingleKvStore 
  44.  */ 
  45. private SingleKvStore createDb(KvManager kvManager) { 
  46.     HiLog.info(LABEL, "createDb"); 
  47.     SingleKvStore kvStore = null
  48.     try { 
  49.         Options options = new Options(); 
  50.         //單版本數據庫,不加密,沒有可用的 KvStore 數據庫就創建 
  51.         //單版本分布式數據庫,默認開啟組網設備間自動同步功能, 
  52.         //如果應用對性能比較敏感建議設置關閉自動同步功能setAutoSync(false),主動調用sync接口同步。 
  53.         options.setCreateIfMissing(true
  54.                 .setEncrypt(false
  55.                 .setKvStoreType(KvStoreType.SINGLE_VERSION); 
  56.         //創建數據庫 
  57.         kvStore = kvManager.getKvStore(options, STORE_ID); 
  58.  
  59.     } catch (KvStoreException exception) { 
  60.         HiLog.error(LABEL, "some exception happen"); 
  61.     } 
  62.     return kvStore; 

權限config.json

  1. "reqPermissions": [ 
  2.     { 
  3.       "name""ohos.permission.DISTRIBUTED_DATASYNC"
  4.       "reason""同步粘貼板數據"
  5.       "usedScene": { 
  6.         "when""inuse"
  7.         "ability": [ 
  8.           "ohos.samples.pasteboard.paste.MainAbility"
  9.           "ohos.samples.pasteboard.paste.ServiceAbility" 
  10.         ] 
  11.       } 
  12.     }, 
  13.     { 
  14.       "name""ohos.permission.GET_DISTRIBUTED_DEVICE_INFO" 
  15.     }, 
  16.     { 
  17.       "name""ohos.permission.KEEP_BACKGROUND_RUNNING" 
  18.     } 
  19.   ] 

六、思考總結

1.粘貼板板傳遞數據可能會存在安全問題,需要注意,要根據具體場景來使用。

設備內每次傳輸的粘貼數據大小不能超過 800 KB。每次設備間傳輸的數據不能超過64KB,且數據必須為文本格式。

2.idl的使用,在上述案例中,客戶端(copy) 和 服務端(paste) 項目idl下內容完全一致即可。

HarmonyOS Sample 之 Pasteboard 分布式粘貼板-鴻蒙HarmonyOS技術社區
HarmonyOS Sample 之 Pasteboard 分布式粘貼板-鴻蒙HarmonyOS技術社區

七、完整代碼

附件可以直接下載

https://harmonyos.51cto.com/resource/1489

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

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

https://harmonyos.51cto.com

 

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

2021-12-10 15:06:56

鴻蒙HarmonyOS應用

2021-08-24 15:13:06

鴻蒙HarmonyOS應用

2018-02-08 16:45:22

前端JS粘貼板

2023-02-06 07:17:22

2018-07-17 08:14:22

分布式分布式鎖方位

2025-06-13 07:30:51

2021-10-21 10:03:09

鴻蒙HarmonyOS應用

2021-11-16 09:38:10

鴻蒙HarmonyOS應用

2022-03-06 21:43:05

Citus架構PostgreSQL

2019-09-26 15:43:52

Hadoop集群防火墻

2019-02-13 13:41:07

MemCache分布式HashMap

2021-05-28 09:52:00

鴻蒙HarmonyOS應用

2020-11-06 12:12:35

HarmonyOS

2019-10-10 09:16:34

Zookeeper架構分布式

2017-09-01 05:35:58

分布式計算存儲

2023-05-29 14:07:00

Zuul網關系統

2019-06-19 15:40:06

分布式鎖RedisJava

2021-07-22 10:20:21

鴻蒙HarmonyOS應用

2019-12-26 08:59:20

Redis主從架構

2019-07-04 15:13:16

分布式緩存Redis
點贊
收藏

51CTO技術棧公眾號

国产www精品| 欧美色精品在线视频| 国产成人精品一区二区三区福利| 国产无码精品一区二区| 亚欧日韩另类中文欧美| 欧美在线观看一二区| 黄黄视频在线观看| 日本在线视频1区| 麻豆精品一区二区综合av| 成人444kkkk在线观看| 日本黄色动态图| 在线播放成人| 色综合久久88色综合天天| 99热都是精品| www免费网站在线观看| 成人免费不卡视频| 91精品免费视频| 国产又黄又粗又爽| 欧美国产日本| 亚洲香蕉在线观看| 亚洲乱妇老熟女爽到高潮的片| 韩日一区二区| 黑人与娇小精品av专区| 成人在线视频一区二区三区| 岛国在线大片| av中文字幕不卡| 亚洲自拍偷拍第一页| 中文字幕在线天堂| 国产亚洲网站| 久久免费视频这里只有精品| 91香蕉一区二区三区在线观看| 色婷婷狠狠五月综合天色拍 | 一区二区欧美久久| 在线xxxxx| 日韩第一区第二区| 91精品黄色片免费大全| 青青青在线视频免费观看| 激情国产在线| 五月天激情综合| 日韩欧美精品免费| 青青草视频在线免费直播| 国产精品久久久久国产精品日日| 人偷久久久久久久偷女厕| 天堂在线视频免费| 成人国产亚洲欧美成人综合网| 91在线高清视频| 一区二区久久精品66国产精品| 日韩高清在线观看| 国产精品久久久久999| 国产suv精品一区二区33| 先锋影音久久久| 97超级碰在线看视频免费在线看| 精品无码人妻一区二区三| 欧美激情麻豆| 久久久在线视频| 国产第一页在线播放| 在线国产日韩| 欧美一级成年大片在线观看| 中文字幕第四页| 久久精品官网| 国产精品一区二区久久久| 亚洲精品国产精品国自产网站按摩| 日韩中文字幕1| 国产精品久久久久久久午夜| 中文字幕+乱码+中文| 日本少妇一区二区| 国产一区香蕉久久| 亚洲第一天堂影院| 本田岬高潮一区二区三区| 鲁鲁视频www一区二区| 国模吧精品人体gogo| 国产精品久久久久久一区二区三区| 一区二区三区四区免费视频| jizzjizz亚洲| 亚洲第一精品在线| 欧美三级午夜理伦三级| 欧美黄页免费| 欧美成人女星排名| 成年人网站免费在线观看| 欧美一区二区性| 欧美另类在线播放| 午夜精品久久久久久久久久久久久蜜桃 | 在线成人激情视频| 丁香花五月激情| 在线播放一区| 国产欧美一区二区三区视频| 超碰在线观看av| 久久久综合视频| a级黄色片网站| 僵尸再翻生在线观看| 欧美亚洲国产一区在线观看网站| 一起草最新网址| 国产精品亚洲人成在99www| yellow中文字幕久久| 日本熟妇毛茸茸丰满| 麻豆免费精品视频| 久久大片网站| 中文字幕资源网在线观看| 精品久久久免费| 天天操精品视频| 免费观看久久av| 欧美高跟鞋交xxxxxhd| 国产嫩bbwbbw高潮| 成人中文字幕合集| 亚洲人体一区| 久久男人av资源站| 欧美一区二区在线播放| 日韩精品无码一区二区三区久久久 | 国产视频在线观看一区二区| 黄色精品视频在线观看| 新67194成人永久网站| 亚洲va欧美va国产综合久久| 九九九伊在人线综合| 亚洲一区二区三区四区在线免费观看| 国产精品亚洲二区在线观看| youjizzjizz亚洲| 精品国产自在精品国产浪潮| 无码人妻丰满熟妇区bbbbxxxx| 粉嫩欧美一区二区三区高清影视| 亚洲自拍的二区三区| 在线天堂中文资源最新版| 精品国偷自产国产一区| 杨钰莹一级淫片aaaaaa播放| 日韩av高清在线观看| 久久精品中文字幕一区二区三区 | 综合激情一区| 国产精品视频1区| 美女毛片在线看| 欧美日韩国产影院| 久久久久亚洲av成人网人人软件| 99久久.com| 国产精品狼人色视频一区| 美女毛片在线看| 欧美视频中文字幕在线| 日本黄色录像片| 亚洲先锋成人| 国产91视觉| 黑人精品视频| 亚洲成年人影院在线| 免费在线观看亚洲| 国产suv精品一区二区6| 国产精品一二三在线观看| 91精品一区| 欧美成人精品一区| www.com欧美| 亚洲国产一区视频| 国产一级免费片| 极品尤物久久久av免费看| 动漫美女被爆操久久久| 色www永久免费视频首页在线| 制服丝袜在线91| 欧美久久久久久久久久久久| 国产69精品久久777的优势| 成年人视频网站免费| 超碰地址久久| 91av成人在线| 免费理论片在线观看播放老| 欧洲国产伦久久久久久久| 亚洲精品国产91| 寂寞少妇一区二区三区| 黄色网zhan| 成人精品动漫一区二区三区| 亚州成人av在线| 精品视频二区| 欧美人妖巨大在线| 久久久久亚洲av无码专区| 成人精品一区二区三区四区 | 免费av成人在线| 一区二区成人国产精品| 日本免费一区二区视频| 91国内在线视频| 国产精品天堂| 欧美大片顶级少妇| 免费看日批视频| 亚洲天堂精品视频| 亚洲蜜桃精久久久久久久久久久久| 男女精品网站| 亚洲天堂av免费在线观看| 精品国产午夜肉伦伦影院| 国产精品久久99久久| 国产美女av在线| 日韩精品中文在线观看| 国产精品高清无码| 亚洲一区二区视频在线| 一级黄色性视频| 国产精品资源在线看| 日韩av黄色网址| 91精品国产91久久久久久黑人| 国产精品一区免费观看| 成人国产综合| 97福利一区二区| 在线播放毛片| 精品爽片免费看久久| 91中文字幕在线播放| 性感美女久久精品| 永久免费看片直接| 91免费在线看| 丰满人妻一区二区三区53视频| 国产精品女主播一区二区三区| 一本久道久久综合| 日韩有码一区| 91久久国产综合久久蜜月精品| 国模冰冰炮一区二区| 九九视频直播综合网| 国产视频三级在线观看播放| 精品美女在线观看| 中文字幕日本人妻久久久免费| 午夜在线电影亚洲一区| 日本高清不卡免费| 欧美国产日韩亚洲一区| 精品国产人妻一区二区三区| 国产在线一区二区| 久草福利视频在线| 午夜在线播放视频欧美| 99色这里只有精品| 欧美黄色一级视频| 一区二区三区欧美在线| 欧美日韩中文字幕一区二区三区 | 1314成人网| 美女性感视频久久| 妞干网在线免费视频| 极品日韩av| 特级西西人体www高清大胆| 色琪琪久久se色| 日韩免费av电影| 中文字幕精品影院| 精品在线视频一区二区三区| 中文久久电影小说| 91成人理论电影| 欧美日韩黄色| 亚洲a成v人在线观看| 亚洲精品无播放器在线播放| 国产精品美女无圣光视频| 欧美电影免费观看高清完整| 日韩av片免费在线观看| 色戒汤唯在线观看| 4438全国亚洲精品在线观看视频| √8天堂资源地址中文在线| 欧美激情久久久久| 国产蜜臀一区二区打屁股调教| 欧美激情精品久久久久久黑人| 超碰免费公开在线| 欧美成人精品一区| 欧美xxxbbb| 韩剧1988免费观看全集| 18aaaa精品欧美大片h| 97视频com| 亚洲欧美小说色综合小说一区| 欧美亚洲国产成人精品| 中文不卡1区2区3区| 日本欧美在线视频| 日韩一区精品| 91精品在线影院| 亚洲国产aⅴ精品一区二区| 波多野结衣一区二区三区在线观看| 一区二区三区亚洲变态调教大结局 | 国产网站一区二区三区| 一级肉体全黄裸片| 国产精品免费观看视频| avove在线播放| 亚洲va国产天堂va久久en| 中文字幕精品三级久久久 | 国产视频在线观看免费| 日韩精品一区国产麻豆| 色网站免费观看| 亚洲品质视频自拍网| 国产精品ⅴa有声小说| 日韩在线视频线视频免费网站| a级毛片免费观看在线| 久久久欧美一区二区| 欧美特大特白屁股xxxx| 国产在线久久久| 国产成人澳门| 日韩资源av在线| 中文字幕乱码亚洲无线精品一区| 欧洲精品在线播放| 久久久人人人| 51自拍视频在线观看| av不卡免费在线观看| 一级二级黄色片| 亚洲夂夂婷婷色拍ww47| 中文字幕在线日本| 日韩视频一区二区| 国产小视频福利在线| 久久伊人91精品综合网站| 久草在线中文最新视频| 成人激情综合网| 三级小说欧洲区亚洲区| av磁力番号网| 久久不射中文字幕| 美女被艹视频网站| 国产亚洲综合av| 亚洲精品在线观看av| 在线免费观看成人短视频| 亚洲a视频在线| 一区二区欧美激情| 国内激情视频在线观看| 91久久嫩草影院一区二区| 亚洲a级精品| 成年丰满熟妇午夜免费视频| 久久一区亚洲| 成人做爰www看视频软件| 欧美激情资源网| 好吊妞视频一区二区三区| 在线综合+亚洲+欧美中文字幕| 色鬼7777久久| 午夜精品一区二区三区在线视频| 婷婷成人av| 日韩高清dvd| 国产免费成人| 中文字幕免费高清视频| 亚洲乱码国产乱码精品精的特点 | 亚洲一级生活片| 在线看国产一区二区| 天堂av中文字幕| 久久99精品久久久久久噜噜| 国产精品久久乐| 日韩.欧美.亚洲| 男人的天堂亚洲在线| 影音先锋黄色资源| 亚洲一区影音先锋| 国产高清第一页| 日韩视频免费大全中文字幕| 中文.日本.精品| 日本日本精品二区免费| 一区二区日韩免费看| 亚洲自拍偷拍精品| 亚洲一区在线观看免费观看电影高清| 国产欧美综合视频| 久久精品色欧美aⅴ一区二区| 成人国产激情| 日韩中文字幕一区二区| 日韩va欧美va亚洲va久久| 亚洲午夜福利在线观看| 欧美视频在线看| 久久久久久久影视| 国产成人欧美在线观看| 国产欧美一区二区精品久久久| 可以在线看的黄色网址| 久久久久久黄色| 综合久久中文字幕| 在线观看欧美日韩国产| 日韩精品麻豆| 亚洲国产欧美不卡在线观看| 日韩1区2区3区| 国产精品久久久免费看| 欧美久久一二三四区| 老司机午夜在线| 999视频在线免费观看| 午夜亚洲福利| 538国产视频| 色综合久久天天| 草草影院在线观看| 成人精品在线视频| 国产在线日韩| 草草地址线路①屁屁影院成人| 精品日本高清在线播放| 可以在线观看的黄色| 国产精品久久久久影院日本| 91精品综合久久久久久久久久久 | 日本wwww视频| 国产日韩欧美制服另类| 国产绿帽一区二区三区| 欧美国产日韩二区| 色婷婷久久久| 亚洲 欧美 另类人妖| 亚洲欧美激情小说另类| 成人午夜视频一区二区播放| 7m精品福利视频导航| 日韩欧美视频| 深夜视频在线观看| 色诱视频网站一区| 黄色网页在线免费看| 国产一区二区精品在线| 久久久久国产精品一区三寸| 九九热久久免费视频| 精品av久久707| 二吊插入一穴一区二区| 欧美少妇一区二区三区| 91麻豆国产福利在线观看| 一级黄色片免费| 久久久久久18| 日韩精品网站| 亚洲色偷偷色噜噜狠狠99网| 欧美在线播放高清精品| 人妖欧美1区| 日韩精品一线二线三线| 国产91精品久久久久久久网曝门| 好吊色在线视频| 欧美高跟鞋交xxxxxhd| 国产日产精品_国产精品毛片| 中文字幕欧美视频| 欧美在线制服丝袜| 波多野结衣中文字幕久久| 日韩三级电影免费观看| 高清在线不卡av| 伊人网免费视频| 欧美影院在线播放| 欧美xxx在线观看| 国产成人一区二区在线观看|