DUICUO

HarmonyOS オープンソースサードパーティコンポーネント - プロセス間通信用の AndLinker コンポーネント

[[415055]]

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

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

https://harmonyos..com

1. コンポーネント

AndLinkerは、OpenHarmony上のIPC(プロセス間通信)ライブラリです。ZidlとRetrofitの多くの機能を統合し、RxJavaおよびRxJava2コールアダプタとシームレスに統合できます。プロジェクトの設計と一部のコードは、優れたRetrofitプロジェクトに基づいています。

2. Gradle設定を更新する

build.gradleファイルを編集します。dependenciesセクションに次の行を追加する必要があります。

  1. 依存関係 {
  2. // アプリのその他の依存関係
  3. 実装'io.github.dzsf:andlinker:1.0.0'  
  4. }

3. 機能特性

  • AIDL インターフェースを通常の Java インターフェースに置き換えます。
  • Retrofit と同様に、リモート サービス インターフェイスの IPC 実装を生成します。
  • 呼び出しアダプターをサポートします: Call、RxJava Observable、RxJava2 Observable、Flowable。
  • リモート サービス コールバック メカニズムをサポートします。
  • AIDL のすべてのデータ型をサポートします。
  • AIDL のすべてのデータ方向タグ (in、out、inout) をサポートします。
  • oneway キーワードは AIDL をサポートします。

4. 使い方

@RemoteInterface アノテーションを使用して、リモート サービス インターフェイス IRemoteService を装飾し、実装します。

  1. @リモートインターフェース
  2. パブリックインターフェイス IRemoteService {
  3.  
  4. 整数getPid();
  5.  
  6. void basicTypes( int anInt, long aLong, boolean aBoolean, float aFloat,
  7. ダブルaDouble、文字列 aString);
  8.  
  9. void registerCallback(@Callback IRemoteCallback コールバック);
  10.  
  11. void 方向パラメータメソッド( @In   int [] arr、@ Out ParcelableObj obj、@Inout Rect rect);
  12.  
  13. @一方通行
  14. void onewayMethod(文字列メッセージ);
  15. }

サーバーサイドアプリで、AndLinkerBinderオブジェクトを作成し、上記のインターフェース実装を登録します。そして、それをonBind()メソッドで返してクライアントに公開します。

  1. プライベート AndLinkerBinder mLinkerBinder;
  2. @オーバーライド
  3. パブリックvoid onStart(インテント インテント) {
  4. super.onStart(インテント);
  5. HiLog.debug(ラベル、 「サービスonCreate()」 );
  6. mLinkerBinder = AndLinkerBinder.Factory.newBinder();
  7. mLinkerBinder.registerObject(mRemoteService);
  8. mLinkerBinder.registerObject(mRemoteTask);
  9. }
  10.  
  11. @オーバーライド
  12. パブリックIRemoteObject onConnect(インテントインテント) {
  13. HiLog.debug(ラベル、 「サービスonBind()」 );
  14. (IRemoteObject) mLinkerBinder を返します
  15. }

クライアント アプリケーションでは、Builder メソッドを使用して AndLinker オブジェクトが作成され、create() メソッドを使用して IRemoteService リモート インターフェイスの IPC 実装が生成されます。

  1. パブリッククラス MainAbilitySlice は AbilitySlice を拡張し、AndLinker.BindCallback、Component.ClickedListener を実装します{
  2. プライベート静的最終文字列 TAG = "BindingActivity" ;
  3. プライベート静的最終文字列 REMOTE_SERVICE_PKG = "com.example.andlinker" ;
  4. 公共 静的最終文字列 REMOTE_SERVICE_ACTION = "com.example.andlinker.REMOTE_SERVICE_ACTION" ;
  5. プライベート HiLogLabel ラベル = 新しい HiLogLabel(HiLog.ERROR,0,TAG);
  6. プライベート IRemoteTask mRemoteTask;
  7. プライベート IRemoteService mRemoteService;
  8. プライベート AndLinker mLinker;
  9.  
  10. @オーバーライド
  11. パブリックvoid onStart(インテント インテント) {
  12. super.onStart(インテント);
  13. super.setUIContent(ResourceTable.Layout_ability_main);
  14. mLinker = 新しい AndLinker.Builder(これ)
  15. .パッケージ名(REMOTE_SERVICE_PKG)
  16. .アクション(REMOTE_SERVICE_ACTION)
  17. .className( "com.example.andlinker.RemoteService" )
  18. .addCallAdapterFactory( OriginalCallAdapterFactory.create ()) // 基本
  19. .addCallAdapterFactory( RxJava2CallAdapterFactory.create ()) // RxJava2
  20. 。建てる();
  21. mLinker.setBindCallback(これ);
  22. mLinker.registerObject(mRemoteCallback);
  23. mlinker.bind();
  24. }

これで、mRemoteService オブジェクト内のすべてのメソッドは IPC メソッドになりました。

基本的な使い方 - 効果のデモンストレーション

AndLinker はすべての AIDL データ型をサポートしています。

  • Java 言語のすべてのプリミティブ型: int、long、char、boolean など。
  • 文字シーケンス
  • パラセラブル
  • リスト(リスト内のすべての要素は、このリストでサポートされているデータ型である必要があります)
  • マップ (マップ内のすべての要素は、このリストでサポートされているデータ型である必要があります)
  1. ボタン buttonBtnPid = (Button) findComponentById(ResourceTable.Id_btn_pid);
  2. buttonBtnPid.setClickedListener(新しいComponent.ClickedListener() {
  3. @オーバーライド
  4. パブリックvoid onClick(コンポーネント コンポーネント) {
  5. ToastDialog ダイアログ = 新しい ToastDialog(MainAbilitySlice.this);
  6. dialog.setText( "サーバーPID: " + mRemoteService.getPid()).show();
  7. }
  8. });
  9.  
  10. ボタン buttonBtnBasicTypes = (Button) findComponentById(ResourceTable.Id_btn_basic_types);
  11. buttonBtnBasicTypes.setClickedListener(新しいComponent.ClickedListener() {
  12. @オーバーライド
  13. パブリックvoid onClick(コンポーネント コンポーネント) {
  14. mRemoteService.basicTypes(1, 2L, true , 3.0f, 4.0d, "str" );
  15. }
  16. });


高度な使い方 - 効果のデモンストレーション

1. コールアダプタ

クライアント アプリケーションでは、リモート サービス インターフェイスとラッパー メソッドの戻り値をコピーおよび変更できます。

  1. @リモートインターフェース
  2. パブリックインターフェイス IRemoteService {
  3.  
  4. 整数getPid();
  5.  
  6. void basicTypes( int anInt, long aLong, boolean aBoolean, float aFloat,
  7. ダブルaDouble、文字列 aString);
  8.  
  9. void registerCallback(@Callback IRemoteCallback コールバック);
  10.  
  11. void 方向パラメータメソッド( @In   int [] arr、@ Out ParcelableObj obj、@Inout Rect rect);
  12.  
  13. @一方通行
  14. void onewayMethod(文字列メッセージ);
  15. }

対応する呼び出しアダプタ ファクトリを AndLinker.Builder に登録します。

  1. パブリッククラス MainAbilitySlice は AbilitySlice を拡張し、AndLinker.BindCallback、Component.ClickedListener を実装します{
  2. プライベート静的最終文字列 TAG = "BindingActivity" ;
  3. プライベート静的最終文字列 REMOTE_SERVICE_PKG = "com.example.andlinker" ;
  4. 公共 静的最終文字列 REMOTE_SERVICE_ACTION = "com.example.andlinker.REMOTE_SERVICE_ACTION" ;
  5. プライベート HiLogLabel ラベル = 新しい HiLogLabel(HiLog.ERROR,0,TAG);
  6. プライベート IRemoteTask mRemoteTask;
  7. プライベート IRemoteService mRemoteService;
  8. プライベート AndLinker mLinker;
  9.  
  10. @オーバーライド
  11. パブリックvoid onStart(インテント インテント) {
  12. super.onStart(インテント);
  13. super.setUIContent(ResourceTable.Layout_ability_main);
  14. mLinker = 新しい AndLinker.Builder(これ)
  15. .パッケージ名(REMOTE_SERVICE_PKG)
  16. .アクション(REMOTE_SERVICE_ACTION)
  17. .className( "com.example.andlinker.RemoteService" )
  18. .addCallAdapterFactory( OriginalCallAdapterFactory.create ()) // 基本
  19. .addCallAdapterFactory( RxJava2CallAdapterFactory.create ()) // RxJava2
  20. 。建てる();
  21. mLinker.setBindCallback(これ);
  22. mLinker.registerObject(mRemoteCallback);
  23. mlinker.bind();
  24. }


2. リモートサービスインターフェースコールバック

@RemoteInterface アノテーションを使用して、リモート サービスのコールバック インターフェイス IRemoteCallback を装飾します。

  1. @リモートインターフェース
  2. パブリックインターフェイス IRemoteCallback {
  3.  
  4. void onStart();
  5.  
  6. void onValueChange( int値);
  7. }

@Callback アノテーションを使用して、リモート メソッドのコールバック パラメータを装飾します。

  1. void registerCallback(@Callback IRemoteCallback コールバック);

クライアント アプリケーションで、上で定義したリモート サービス コールバック インターフェイス IRemateCallback を実装し、AndLinker に登録します。

  1. プライベートファイナルIRemoteCallback mRemoteCallback = 新しいIRemoteCallback() {
  2.  
  3. @オーバーライド
  4. パブリックvoid onStart() {
  5. HiLog.debug(label, "サーバーコールバック onStart!" );
  6. }
  7.  
  8. @オーバーライド
  9. パブリックvoid onValueChange( int値) {
  10. //サーバー側のコールバック呼び出す
  11. ToastDialog ダイアログ = 新しい ToastDialog(MainAbilitySlice.this);
  12. ダイアログのサイズを 1000,200 に設定します。
  13. dialog.setText( "サーバーコールバック値: " + value).show();
  14. }
  15. };

3. データターゲティングタグを指定する

リモート メソッドのパラメーターに @In、@Out、または @Inout アノテーションを指定して、基礎となるビルダー内のデータ フローをマークできます。

  1. void 方向パラメータメソッド( @In   int [] arr、@ Out ParcelableObj obj、@Inout Rect rect);

知らせ:

  • すべての非プリミティブ型は、データフローの方向を示すデータ方向タグ(@In、@Out、または@Inout)を指定する必要があります。プリミティブ型はデフォルトで@Inに設定され、他の値を指定することはできません。
  • @Out または @Inout で注釈が付けられた Parcelable パラメータは、SuperParcelable インターフェイスを実装する必要があります。それ以外の場合は、このメソッドを手動で追加する必要があります: public void readFromParcel(Parcel in)。

4. @OnewWayアノテーションを使用する

リモートメソッドに@OneWayアノテーションを使用すると、リモートメソッド呼び出しの動作が変更されます。このアノテーションを使用すると、リモートメソッド呼び出しはブロックされず、単にデータを送信してすぐに戻ります。

  1. @一方通行
  2. void onewayMethod(文字列メッセージ);

5. ダウンロードリンク

5.1 IDE ダウンロードリンク

https://developer.harmonyos.com/cn/develop/deveco-studio#download

5.2 ソースコードリンク

https://gitee.com/openneusoft/and-linkers

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

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

https://harmonyos..com