HarmonyOS サンプルのペーストボード分散ペーストボード

HarmonyOS サンプルのペーストボード分散ペーストボード

[[435097]]

詳細については、以下をご覧ください。

51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ

https://harmonyos..com

1. はじめに

HarmonyOS は、システム クリップボード サービスの操作インターフェイスを提供します。このインターフェイスは、ユーザー プログラムがシステム クリップボードからクリップボード データを読み取り、書き込み、照会したり、システム クリップボード データの変更に対するコールバックを追加および削除したりすることをサポートします。

デバイス内部:

ユーザーはシステム クリップボード サービスを使用して、アプリケーション間で簡単なデータ転送を実現できます。たとえば、アプリケーション A でコピーしたデータはアプリケーション B に貼り付けることができ、その逆も同様です。

機材室:

分散ペーストボードのシナリオでは、貼り付けられたデータを複数のデバイスに書き込むことができます。たとえば、デバイス A 上のアプリケーションは、システム ペーストボード インターフェイスを使用して、デバイス A からコピーされたデータを IDL インターフェイスを介してデバイス B のシステム ペーストボードに保存します。データが許可する場合、デバイス B 上のアプリケーションはコピーされたデータを読み取ってシステム ペーストボードに貼り付けることができます。デバイス間でのペーストボードの分散コラボレーションを実現します。

上記の理解に基づいて、分散ペーストボード アプリケーションが実装されます。アプリケーションはクライアント(コピー)とサーバー(貼り付け)の2つの部分に分かれており、データ転送はidlを通じて実現されます。

クライアントはデータの収集を担当し、サーバーはデータの表示と適用を担当します。クライアントとサーバーは、同じデバイスまたは異なるデバイスにインストールできます。サーバーは複数のデバイスにインストールすることもできます。サーバーは分散データベースを通じてクリップボード データの自動同期を実現します。

2. エフェクト表示


3. 環境を構築する

DevEco Studio をインストールします。詳細については、DevEco Studio のダウンロードを参照してください。

DevEco Studio 開発環境をセットアップします。 DevEco Studio 開発環境はネットワーク環境に依存する必要があります。ツールを正常に使用するには、ネットワークに接続する必要があります。次の 2 つの状況に応じて開発環境を構成できます。

インターネットに直接アクセスできる場合は、HarmonyOS SDK をダウンロードするだけで済みます。

ネットワークがインターネットに直接アクセスできず、プロキシ サーバー経由でアクセスする必要がある場合は、「開発環境の構成」を参照してください。

ソースコードをダウンロードしたら、DevEco Studio を使用してプロジェクトを開き、シミュレーターを実行します。

実際のデバイスで実行するには、config.json の buddleName を独自のものに変更する必要があります。まだ設定していない場合は、AppGallery Connect で設定してください。詳細については、「シミュレータを使用したデバッグ」を参照してください。

IV.プロジェクト構造



5. コードの説明

5.1 システムクリップボードの基本機能の紹介

システムペーストボードオブジェクトの概要

1. SystemPasteboard // システム ペーストボード オブジェクト。コピー、貼り付け、ペーストボード コンテンツの変更に対するリスナーの設定など、システム ペーストボード操作を定義します。

2.PasteData//ペーストボード上の貼り付けデータを示します。

3.PasteData.DataProperty // このクラスは、タイムスタンプ、MIME タイプ、その他の属性データなど、システム ペーストボード上の PasteData のプロパティを定義します。

4.PasteData.Record // このクラスは、貼り付けられた単一のデータをレコードとして定義します。レコードには、プレーン テキスト、HTML テキスト、URI、およびインテントを使用できます。 PasteData オブジェクトには 1 つ以上のレコードが含まれます。

クライアント (コピー) CopyAbilitySlice.java

システム ペーストボードを取得し、ペーストボード データの変更を監視します。

  1. /**
  2. * システムペーストボードを取得する
  3. * ペーストボードデータの変更を監視する
  4. */
  5. プライベートvoid initPasteboard() {
  6. HiLog.debug(LABEL、 "initPasteboard" );
  7. //システムペーストボードオブジェクトを取得する
  8. ペーストボード = SystemPasteboard.getSystemPasteboard(これ);
  9. //ペーストボードデータの変更を監視する
  10. pastboard.addPasteDataChangedListener(() -> {
  11. if (pasteboard.hasPasteData()) {
  12. sync_text = getPasteData();
  13. HiLog.debug(LABEL、 "%{public}s" "pasteStr:" + sync_text);
  14. }
  15. });
  16. }

ペーストボードの内容を取得する

  1. /**
  2. * クリップボードの記録を取得する
  3. *
  4. * @戻る 
  5. */
  6. プライベート文字列getPasteData() {
  7. HiLog.debug(LABEL、 "getPasteData" );
  8. 文字列結果 = "" ;
  9.  
  10. //ペーストボードデータオブジェクト
  11. ペーストデータペーストデータ = ペーストボード.getPasteData();
  12. 貼り付けデータ == nullの場合{
  13. 結果を返します
  14. }
  15. PasteData.DataProperty データプロパティ = pasteData.getProperty();
  16. //
  17. ブール型 hasHtml = dataProperty.hasMimeType(PasteData.MIMETYPE_TEXT_HTML);
  18. ブール型 hasText = dataProperty.hasMimeType(PasteData.MIMETYPE_TEXT_PLAIN);
  19.  
  20. //データ形式の種類
  21. HTML がある場合 || テキストがある場合
  22. ( int i = 0; i < pasteData.getRecordCount(); i++) {
  23. //ペーストボードデータレコード
  24. PasteData.Record レコード = pasteData.getRecordAt(i);
  25. //異なるタイプには異なる取得方法があります
  26. 文字列 mimeType = record.getMimeType();
  27. //HTMLテキスト
  28. mimeType が PasteData.MIMETYPE_TEXT_HTML と等しい場合
  29. 結果 = record.getHtmlText();
  30. //プレーンテキスト
  31. }そうでない場合 (mimeType.equals(PasteData.MIMETYPE_TEXT_PLAIN)) {
  32. 結果 = record.getPlainText().toString();
  33. //
  34. }それ以外{
  35. HiLog.info(LABEL、 "%{public}s" "getPasteData mimeType :" + mimeType);
  36. }
  37. }
  38. }
  39. 結果を返します
  40. }

ペーストボードにテキストを設定する

  1. /**
  2. * ペーストボードにテキストを設定する
  3. *
  4. * @param コンポーネント
  5. */
  6. プライベート void setTextToPaste(コンポーネント コンポーネント) {
  7. HiLog.info(LABEL, "setTextToPaste" );
  8. if (ペーストボード != null ) {
  9. 文字列テキスト = syncText.getText();
  10. テキストが空の場合(){
  11. showTips(this, "内容を入力してください" );
  12. 戻る;
  13. }
  14. // レコードをペーストボードに追加します
  15. PasteData pasteData= PasteData.creatPlainTextData(テキスト);
  16. //テキストをペーストボードに設定する
  17. pasteboard.setPasteData(pasteData);
  18.  
  19. showTips(this, "コピーが成功しました" );
  20. HiLog.info(LABEL, "setTextToPaste が成功しました" );
  21. }
  22. }

ペーストボードをクリアする

  1. /**
  2. * ペーストボードをクリアする
  3. *
  4. * @param コンポーネント
  5. */
  6. プライベート void clearPasteboard(コンポーネント コンポーネント) {
  7. if (ペーストボード != null ) {
  8. ペーストボードをクリアします。
  9. showTips(this, "クリアに成功しました" );
  10. }
  11. }

5.2 分散ペーストボードアプリケーションの構築アイデアの紹介


リモート接続デバイスを選択

この例は、新しい DevicesSelectAbility を追加することによって実装されます。

  1. プライベートvoid showDevicesDialog() {
  2. インテントのintent = 新しいIntent();
  3. //デバイスを選択するためのAbilityページを開くDevicesSelectAbility
  4. 操作操作 =
  5. 新しい Intent.OperationBuilder()
  6. .withDeviceId( "" )
  7. .withBundleName(バンドル名を取得())
  8. .withAbilityName(デバイス選択アビリティ.クラス)
  9. 。建てる();
  10. インテントをsetOperation(操作);
  11. //デバイス選択要求識別子を持ち、デバイス選択ページを開く (DevicesSelectAbility) TODO
  12. startAbilityForResult(インテント、Constants.PRESENT_SELECT_DEVICES_REQUEST_CODE);
  13. }
  14.  
  15. /**
  16. * デバイスを開いてアビリティを選択した後、接続されたデバイスを選択し、setResultを実行してトリガーします。
  17. *
  18. * @param リクエストコード
  19. * @param 結果コード
  20. * @param 結果インテント
  21. */
  22. @オーバーライド
  23. 保護されたvoid onAbilityResult( int requestCode, int resultCode, Intent resultIntent) {
  24. HiLog.debug(LABEL、 "onAbilityResult" );
  25. リクエストコード == Constants.PRESENT_SELECT_DEVICES_REQUEST_CODE && resultIntent != null の場合{
  26. //ユーザーが選択したデバイスを取得する
  27. 文字列デバイスID = resultIntent.getStringParam(Constants.PARAM_DEVICE_ID);
  28. //ペーストボードサーバーに接続する
  29. connectService(デバイスID);
  30. 戻る;
  31. }
  32. }

クリップボードサーバーのServiceAbilityサービスに接続する

idl ファイルは、ohos.samples.pasteboard.paste ディレクトリに配置されます。 Gradl ウィンドウで compileDebugIdl を実行すると、システムによってプロキシ オブジェクトが生成されます。

  1. インターフェース ohos.samples.pasteboard.paste.ISharePasteAgent {
  2. /*
  3. * システムペーストボードを設定する
  4. */
  5. void setSystemPaste([ in ] String param);
  6. }

ServiceAbility サーバーに接続します。ネットワーク内に他のデバイスがない場合、ローカル サーバーに接続します。

接続が成功したら、データ同期の次のステップのために idl の SharePasteAgentProxy エージェントを初期化します。

  1. //idl 共有ペーストボードプロキシ
  2. プライベート SharePasteAgentProxy リモートエージェントプロキシ;
  3.  
  4. /**
  5. * ペーストボードサービスセンターに接続
  6. */
  7. プライベートvoid connectService(文字列デバイスID) {
  8. HiLog.debug(LABEL、 "%{public}s" "connectService" );
  9. 接続されている場合
  10. ブール値 isConnectRemote = deviceId != null ;
  11. //ローカル サービスに接続するかリモート サービスに接続するかを決定する三項式
  12. インテント インテント = isConnectRemote
  13. ? getRemoteServiceIntent(REMOTE_BUNDLE、REMOTE_SERVICE、デバイスID)
  14. : getLocalServiceIntent(REMOTE_BUNDLE、REMOTE_SERVICE);
  15.  
  16. HiLog.debug(LABEL、 "%{public}s" "intent:" + intent);
  17. //サービスに接続
  18. connectAbility(インテント、新しいIAbilityConnection() {
  19. @オーバーライド
  20. パブリックvoid onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, int resultCode) {
  21. //サービス接続が成功したことを通知する
  22. イベントハンドラは、EVENT_ABILITY_CONNECT_DONE を送信します。
  23. // プロキシを初期化する
  24. リモートエージェントプロキシ = 新しい SharePasteAgentProxy(iRemoteObject);
  25. HiLog.debug(LABEL、 "%{public}s" "remoteAgentProxy:" + remoteAgentProxy);
  26. }
  27.  
  28. @オーバーライド
  29. パブリックvoid onAbilityDisconnectDone(要素名要素名、 int結果コード) {
  30. //サービスが切断されたことを通知します。アクティブな切断は実行されませんが、サーバーの終了は実行されます
  31. イベントハンドラは、EVENT_ABILITY_DISCONNECT_DONE を送信します。
  32. }
  33. });
  34. }
  35. }
  36. /**
  37. * リモートクリップボードサービスセンターを取得する
  38. *
  39. * @param バンドル名
  40. * @param サービス名
  41. * @戻る 
  42. */
  43. プライベートインテント getRemoteServiceIntent(文字列バンドル名、文字列サービス名、文字列デバイスID) {
  44. HiLog.debug(LABEL、 "%{public}s" "getRemoteServiceIntent" );
  45. 操作 operation = new Intent.OperationBuilder()
  46. .withDeviceId(デバイスID)
  47. .withBundleName(バンドル名)
  48. .withAbilityName(サービス名)
  49. //重要
  50. .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
  51. 。建てる();
  52. インテントのintent = 新しいIntent();
  53. インテントをsetOperation(操作);
  54. 意図を返す;
  55. }
  56.  
  57. /**
  58. * 地元の厚紙サービスセンターを利用する
  59. *
  60. * @param バンドル名
  61. * @param サービス名
  62. * @戻る 
  63. */
  64. プライベートインテント getLocalServiceIntent(String bundleName, String serviceName) {
  65. HiLog.debug(LABEL、 "%{public}s" "getLocalServiceIntent" );
  66. 操作 operation = new Intent.OperationBuilder().withDeviceId( "" )
  67. .withBundleName(バンドル名)
  68. .withAbilityName(サービス名)
  69. 。建てる();
  70. インテントのintent = 新しいIntent();
  71. インテントをsetOperation(操作);
  72. 意図を返す;
  73. }

データをサーバーに同期する

  1. /**
  2. * クリップボードの記録をクリップボードサービスセンターに同期する
  3. *
  4. * @param コンポーネント
  5. */
  6. プライベート void syncData(コンポーネント コンポーネント) {
  7. HiLog.debug(LABEL、 "sync_text:" + sync_text);
  8. sync_text.isEmpty() の場合 {
  9. if (isConnect && remoteAgentProxy != null ) {
  10. //サーバーのIPCメソッドを呼び出す
  11. 試す {
  12. リモートエージェントプロキシ.setSystemPaste(sync_text);
  13. //テキストを変更する
  14. syncText.setText(getRandomText());
  15. 同期テキスト = "" ;
  16. showTips(this, "同期が成功しました" );
  17. } キャッチ (RemoteException リモート例外) {
  18. リモート例外を printStackTrace();
  19. }
  20. }それ以外{
  21. showTips(this, "デバイスを接続しています" );
  22. }
  23. }それ以外{
  24. showTips(this, "クリックしてクリップボードにコピー" );
  25. }
  26. }

貼り付けたテキストをランダムに生成する

  1. /**
  2. * ランダムテキスト、シミュレートされたデータ
  3. *
  4. * @戻る 
  5. */
  6. パブリック文字列getRandomText() {
  7. リスト<文字列> リスト = Arrays.asList(
  8. 「私は馬から降りずに疾走し、馬は空から3フィート3メートルの高さまで上昇しました
  9. 「私は剣を手に持ち、空に向かって笑う。私の忠誠心と勇気は崑崙山脈に残るだろう
  10. 「滝は真下に3000フィート落下し、まるで天の川が空から落ちてくるようです
  11. 「君子は自分の内に求め、悪人は他人に求める
  12. 「私は一日に三度、自分自身を吟味します。他人のために働くとき、私は不誠実ではないだろうか?友人と接するとき、私は信頼できるだろうか?自分の説くことを実践していないだろうか?」 );
  13. int random = new SecureRandom().nextInt(list.size ( ));
  14. list.get(ランダム)を返します
  15. }

サーバー (貼り付け) ServiceAbility.java

ペーストボードサービスの設定

idl ファイルは、ohos.samples.pasteboard.paste ディレクトリに配置されます。 Gradl ウィンドウで、compileDebugIdl を実行すると、システムによってプロキシ オブジェクトが生成されます。 idl は、リモート呼び出し用の setSystemPaste インターフェイスを提供します。

  1. インターフェース ohos.samples.pasteboard.paste.ISharePasteAgent {
  2. /*
  3. * システムペーストボードを設定する
  4. */
  5. void setSystemPaste([ in ] String param);
  6. }
  1. //idlのサーバー実装、
  2. SharePasteAgentStub sharePasteAgentStub = 新しい SharePasteAgentStub(DESCRIPTOR) {
  3. @オーバーライド
  4. パブリックvoid setSystemPaste(String param) {
  5. HiLog.info(LABEL, "%{public}s" , "param:" + param);
  6.  
  7. //データベースに挿入
  8. アイテムの子 itemChild = 新しい ItemChild();
  9. 文字列 currentTime = DateUtils.getCurrentDate( "yyMMdd HH:mm:ss" );
  10. itemChild.setWriteTime(現在の時刻);
  11. パラメータを書き込みます。
  12. itemChild.setIndex(String.valueOf(UUID.randomUUID()));
  13. // デフォルトでは未分類に追加されます
  14. タグ名を要素の末尾にセットします。
  15. //クリップボードのレコードを分散データベースに追加する
  16. kvManagerUtils.addItemChild(itemChild);
  17.  
  18. }
  19. };
  20.  
  21. @オーバーライド
  22. 保護された IRemoteObject onConnect(インテントインテント) {
  23. HiLog.info(LABEL、 "%{public}s" "ServiceAbility onConnect" );
  24. sharePasteAgentStubを返します
  25. }
  26.  
  27. **データベースの初期化**
  28. ```ジャワ
  29. // データベースツールを初期化する
  30. kvManagerUtils = KvManagerUtils.getInstance(これ);
  31.  
  32. // データベース管理オブジェクトを初期化する
  33. kvManagerUtils.initDbManager(eventHandler);
  34.  
  35. //データベースデータの初期化ボタン
  36. イメージ initDb = (イメージ) findComponentById(ResourceTable.Id_init_db);
  37. initDb.setClickedListener(コンポーネント -> {
  38. //デフォルトでは「未定義」ラベルが選択されます
  39. 現在の選択カテゴリインデックス = 0;
  40. // データベースデータを初期化する
  41. kvManagerUtils.initDbData();
  42. showTip( "初期化が完了しました" );
  43. });

データリストを初期化する

  1. /**
  2. * 分散データベースからデータをクエリする
  3. */
  4. パブリックボイドクエリデータ(){
  5. HiLog.debug(LABEL、 「クエリデータ」 );
  6. 試す {
  7. //選択したカテゴリのデータリストをロードします
  8. カテゴリデータタグリストを取得します。
  9. } キャッチ (KvStoreException 例外) {
  10. HiLog.info(LABEL, "値は文字列である必要があります" );
  11. }
  12. }
  13.  
  14. /**
  15. * 選択したタグのサブアイテムリストを初期化します
  16. *
  17. * @param itemChildList itemChildList、 itemChildBean
  18. */
  19. プライベートvoid initItemChild(List<ItemChild> itemChildList) {
  20. HiLog.debug(LABEL、 "initItemChild:" + itemChildList);
  21. (itemChildList == nullの場合){
  22. 戻る;
  23. }
  24. //コンポーネントをクリアする
  25. 項目の子レイアウト。すべてのコンポーネントを削除します。
  26. // itemChildを作成する
  27. (ItemChild itemChild : itemChildList)の場合{
  28. //サブアイテムカテゴリが配置されているコンポーネントを取得します
  29. コンポーネント 子コンポーネント =
  30. LayoutScatter.getInstance(this).parse(ResourceTable.Layout_paste_record_per, null false );
  31. //書き込み時間
  32. テキスト writeTime = (テキスト) childComponent.findComponentById(ResourceTable.Id_writeTime);
  33. 書き込み時間を設定します。
  34. // ペーストボードの内容
  35. テキスト writeContent = (テキスト) childComponent.findComponentById(ResourceTable.Id_writeContent);
  36. 書き込みコンテンツ。テキストを設定します。
  37.  
  38. //コピーボタン
  39. テキスト コピー = (テキスト) childComponent.findComponentById(ResourceTable.Id_itemChildPerCopy);
  40. //コピーボタンのリスニングイベント
  41. copy.setClickedListener(コンポーネント -> {
  42. //コンテンツをクリップボードにコピーする
  43. pasteboard.setPasteData(PasteData.creatPlainTextData(itemChild.getWriteContent()));
  44. showTip( "クリップボードにコピーされました" );
  45. });
  46.  
  47. //お気に入りボタン
  48. テキストお気に入り = (テキスト) childComponent.findComponentById(ResourceTable.Id_itemChildPerFavorite);
  49. //コレクションボタンのリスニングイベント
  50. お気に入り.setClickedListener(コンポーネント -> {
  51. //ラベルマイクロが収集されたことを変更する
  52. itemChild.setTagName(Const.CATEGORY_TAG_FAVORITED);
  53. //データを保存する
  54. kvManagerUtils.addItemChild(itemChild);
  55. showTip( "お気に入りに追加されました" );
  56. });
  57.  
  58.  
  59. /******************テスト************************/
  60. //チェックボックス
  61. チェックボックス noteId = (チェックボックス) childComponent.findComponentById(ResourceTable.Id_noteId);
  62. //サブ項目リストのクリックイベント
  63. childComponent.setClickedListener(コンポーネント -> {
  64. noteId.getVisibility() == Component.VISIBLE の場合 {
  65. noteId が Checked であることを確認します。
  66. }
  67. });
  68. //サブ項目リストの長押しイベント、長押しするとチェックボックスが表示されます
  69. childComponent.setLongClickedListener(コンポーネント -> {
  70. //チェックボックスの表示
  71. noteId.setVisibility(Component.VISIBLE);
  72. //チェックボックスのスタイルと他のテキストコンポーネントのインデントを設定します
  73. 要素 element = ElementScatter.getInstance(getContext()).parse(ResourceTable.Graphic_check_box_checked);
  74. noteId.setBackground(要素);
  75. noteId.setChecked( true );
  76. 書き込み時間を設定します。左余白を設定します(80);
  77. 書き込みコンテンツ。左余白を設定します(80);
  78. });
  79. //チェックボックスの状態変更監視イベント。状態は選択されているかどうかを示します。
  80. noteId.setCheckedStateChangedListener((コンポーネント、状態) -> {
  81. //状態変更ロジック
  82. 要素要素;
  83. if (状態) {
  84. //選択したスタイルを設定する
  85. 要素 = ElementScatter.getInstance(getContext())
  86. .parse(ResourceTable.Graphic_check_box_checked);
  87. }それ以外{
  88. //選択されていないスタイルを設定する
  89. 要素 = ElementScatter.getInstance(getContext())
  90. .parse(ResourceTable.Graphic_check_box_uncheck);
  91. }
  92. noteId.setBackground(要素);
  93. });
  94. /******************テスト************************/
  95.  
  96. //レイアウトにサブアイテムリストコンポーネントを追加する
  97. 子コンポーネントを追加します。
  98. }
  99. }

タグ分類表示

  1. //クリックリスナーイベントのリストを初期化する
  2. カテゴリリスト.setItemClickedListener(
  3. (リストコンテナ、コンポーネント、インデックス、l1) -> {
  4. //ポイントは現在のカテゴリです
  5. (categoryListProvider.getSelectIndex() ==インデックス)の場合{
  6. 戻る;
  7. }
  8. //カテゴリインデックスを切り替える
  9. カテゴリリストプロバイダー.setSelectIndex(インデックス);
  10. //選択したタグのインデックスを設定する
  11. current_select_category_index =インデックス;
  12. //現在選択されているタグの名前を取得します
  13. 文字列 tagName = CategoryData.tagList.get(インデックス);
  14. //データベースからタグのサブアイテムリストを照会する
  15. initItemChild(kvManagerUtils.queryDataByTagAndKewWord(searchTextField.getText(), tagName));
  16. //データ更新を通知する
  17. カテゴリリストプロバイダー。データが変更された場合に通知します。
  18. //バーを一番上までスクロールします
  19. itemListScroll.fluentScrollYTo(0);
  20. });

貼り付けレコードの検索

  1. //キー監視イベントを検索
  2. 検索テキストフィールド.setKeyEventListener()
  3. (コンポーネント、キーイベント) -> {
  4. keyEvent.isKeyDown() と keyEvent.getKeyCode() が等しい場合、KeyEvent.KEY_ENTER になります。
  5. //現在選択されているタグの名前を取得します
  6. 文字列 tagName = CategoryData.tagList.get(current_select_category_index);
  7. リスト<ItemChild> itemChildList = kvManagerUtils.queryDataByTagAndKewWord(searchTextField.getText(), tagName);
  8. //データベースからタグのサブアイテムリストを照会する
  9. 子アイテムを初期化します。
  10. //データ更新を通知する
  11. カテゴリリストプロバイダー。データが変更された場合に通知します。
  12. //バーを一番上までスクロールします
  13. itemListScroll.fluentScrollYTo(0);
  14. }
  15. 戻る 間違い;
  16. });

分散データベース ツール KvManagerUtils.java

データ変更通知

分散データベース管理ツール KvManagerUtils.java が提供されており、すべてのデータベース操作がここに集中されます。

データベースのデータが変更されたときにページの表示をタイムリーに更新するために、ページはデータベースを初期化するときに eventHandler オブジェクトを渡し、データベースが変更されたときにページに通知できるようにします。

  1. /**
  2. * データベースの変更通知を購読する
  3. * @param singleKvStore データ操作
  4. */
  5. プライベートvoid subscribeDb(SingleKvStore singleKvStore) {
  6. HiLog.info(ラベル、 「subscribeDb」 );
  7. //データベース オブザーバー クライアント
  8. KvStoreObserver kvStoreObserverClient = 新しい KvStoreObserverClient();
  9. //リモートデータの変更をサブスクライブする
  10. 単一の KvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_REMOTE、kvStoreObserverClient);
  11. }
  12.  
  13. /**
  14. * 分散データベースオブザーバークライアントをカスタマイズする
  15. * データが変更されたときに対応する関数をトリガーする
  16. *データベースメッセージを受信する
  17. */
  18. プライベートクラスKvStoreObserverClientはKvStoreObserverを実装します{
  19. @オーバーライド
  20. パブリックvoid onChange(ChangeNotification通知) {
  21. HiLog.error(LABEL、 「onChange」 );
  22. イベントハンドラの sendEvent(Const.DB_CHANGE_MESS);
  23. }
  24. }

自動データ同期

自動同期はデフォルトで有効になっています

  1. /**
  2. *データベース管理の初期化
  3. * データベース管理者を初期化する
  4. */
  5. パブリックvoid initDbManager(EventHandler eventHandler) {
  6. イベントハンドラは、
  7. HiLog.info(ラベル、 「initDbManager」 );
  8. (singleKvStore == null || kvManager == null )の場合{
  9. HiLog.info(ラベル、 「initDbData」 );
  10. //データベース管理者を作成する
  11. kvManager = createManager();
  12. //データベースを作成
  13. 単一のKvStore = createDb(kvManager);
  14. subscribeDb(シングルKvStore);
  15.  
  16. }
  17. }
  18.  
  19.  
  20.  
  21. /**
  22. *分散データベースマネージャーインスタンスを作成する
  23. * データベース管理者を作成する
  24. *
  25. * @戻る データベースマネージャー
  26. */
  27. プライベートKvManagercreateManager() {
  28. HiLog.info(ラベル、 「createManager」 );
  29. KvManager マネージャー = null ;
  30. 試す {
  31. //
  32. KvManagerConfig config = 新しい KvManagerConfig(コンテキスト);
  33. マネージャー = KvManagerFactory.getInstance().createKvManager(config);
  34. } キャッチ (KvStoreException 例外) {
  35. HiLog.error(LABEL, "何らかの例外が発生しました" );
  36. }
  37. リターンマネージャー;
  38. }
  39.  
  40. /**
  41. * 単一バージョンの分散データベースの作成 
  42. * データベースを作成する
  43. *
  44. * @param kvManagerデータベース管理
  45. * @returnシングルKvストア
  46. */
  47. プライベートシングルKvStore createDb(KvManager kvManager) {
  48. HiLog.info(ラベル、 「createDb」 );
  49. SingleKvStore kvStore = null ;
  50. 試す {
  51. オプション options = new Options();
  52. // 暗号化されていない単一バージョンのデータベース。KvStore データベースが利用できない場合に作成されます。
  53. //単一バージョンの分散データベース、ネットワークデバイス間の自動同期はデフォルトで有効になっています。
  54. // アプリケーションがパフォーマンスに敏感な場合は、自動同期機能 setAutoSync( false ) をオフにし、同期のために同期インターフェイスを積極的に呼び出すことをお勧めします。
  55. オプション.setCreateIfMissing( true )
  56. .setEncrypt( false )
  57. .setKvStoreType(KvStoreType.SINGLE_VERSION);
  58. //データベースを作成
  59. kvStore = kvManager.getKvStore(オプション、STORE_ID);
  60.  
  61. } キャッチ (KvStoreException 例外) {
  62. HiLog.error(LABEL, "何らかの例外が発生しました" );
  63. }
  64. kvStoreを返します
  65. }

権限設定.json

  1. 「必要な権限」 : [
  2. {
  3. 「名前」 : 「ohos.permission.DISTRIBUTED_DATASYNC」
  4. 「理由」 「クリップボードのデータを同期する」
  5. 「使用シーン」 : {
  6. 「いつ」 : 「未使用」
  7. "能力" : [
  8. "ohos.samples.pasteboard.paste.MainAbility" ,
  9. 「ohos.samples.pasteboard.paste.ServiceAbility」  
  10. ]
  11. }
  12. },
  13. {
  14. 「名前」 : 「ohos.permission.GET_DISTRIBUTED_DEVICE_INFO」  
  15. },
  16. {
  17. "名前" : "ohos.permission.KEEP_BACKGROUND_RUNNING"  
  18. }
  19. ]

6. 結論

1. クリップボード経由でデータを転送する場合、セキュリティ上の問題が発生する可能性があります。具体的なシナリオに応じて注意してご使用ください。

デバイス内で一度に転送される貼り付けデータのサイズは 800 KB を超えることはできません。デバイス間で毎回転送されるデータは 64 KB を超えることはできず、データはテキスト形式である必要があります。

2. idl の使用法。上記の場合、クライアント (コピー) プロジェクトとサーバー (貼り付け) プロジェクトの idl の内容はまったく同じである必要があります。


7. 完全なコード

添付ファイルは直接ダウンロードできます

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

詳細については、以下をご覧ください。

51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ

https://harmonyos..com

<<:  最初のポッドを Kubernetes クラスターにデプロイするにはどうすればよいですか?

>>:  マネージド Kubernetes に切り替える 6 つの理由

推薦する

キーワードタイトルとウェブページの説明を書くためのヒント

SEO の仕事では、多くの友人が次のような問題に遭遇することがあります。ウェブサイトの一部のキーワー...

最適化初心者がSEO最適化について語る

SEO最適化にはいろいろあります。初心者なので、まずは基礎からやってみようと思います。 1. 最適化...

Hostsolutions: 著作権なし/苦情防止/1T 大容量ハードディスク VPS、年間わずか 35 ユーロ

hostsolutions、前回の大容量ハードディスク ストレージ VPS が在庫切れになってから長...

インターネットトレンド分析(I)

今年はどんな一年になるでしょうか?元旦前夜、「2019年、中国のインターネットにとって残念な年」と題...

傍観者から CTO へ: Cloud Foundry Foundation での 5 年間

[51CTO.com クイック翻訳] 最近、Cloud Foundry プロジェクトがわずか 5 年...

Dogyun: 低価格に挑戦 - 月額 15 元、US cn2 gia VPS、KVM/512M メモリ/10g SSD/600g トラフィック

Dogyunは、米国サンノゼのCN2 GIAライン向けの特別VPSモデル3つをClassic Clo...

エッジが従来のデータセンターを補完する方法

ビジネスが成長するにつれて、コンピューティング インフラストラクチャの拡大によって障害のリスク ポイ...

あなたは本当にユーザーを理解していますか? 彼らを変えることができないなら、私たちは製品を変えるしかありません。

少し前に、インターネットで「ダウングレード理論」という非常に人気のある記事を見ました。その大まかな考...

#著作権なし VPS# ginernet-年間 10 ユーロ/512M メモリ/10g SSD/300g トラフィック/スペイン

Ginernet はスペインの VPS 販売業者です。当初、ヨーロッパのデータ センターは私たちにと...

budgetvm: 日本製サーバー、$99/e3-1230v3/16g メモリ/120gSSD+2T SATA/1Gbps 帯域幅

おそらくほとんどの人はbudgetvmを知っていると思いますが、これは古いブランドです。アメリカのe...

ホームページの最適化、アクションが重要です!

社内でホームページについて、またそれを改善するための方法について議論し続けるなら、過去に思い描いてい...

SEO時代のもう一つのインパクト:Green Radish 2.0ダイレクトソフト記事プロモーション

青大根アルゴリズムの導入により、外部リンクの取り締まりは終了したと多くの人が考えています。その後に続...

2022年クラウドコンピューティングアプリケーション主要脅威調査

クラウド ワークロード、サプライ チェーン、エッジ コンピューティング、モノのインターネット (Io...