|
[[415055]] 詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したHarmonyOSテクノロジーコミュニティ。 https://harmonyos..com 1. コンポーネントAndLinkerは、OpenHarmony上のIPC(プロセス間通信)ライブラリです。ZidlとRetrofitの多くの機能を統合し、RxJavaおよびRxJava2コールアダプタとシームレスに統合できます。プロジェクトの設計と一部のコードは、優れたRetrofitプロジェクトに基づいています。 2. Gradle設定を更新するbuild.gradleファイルを編集します。dependenciesセクションに次の行を追加する必要があります。 - 依存関係 {
- // アプリのその他の依存関係
- 実装'io.github.dzsf:andlinker:1.0.0'
- }
3. 機能特性- AIDL インターフェースを通常の Java インターフェースに置き換えます。
- Retrofit と同様に、リモート サービス インターフェイスの IPC 実装を生成します。
- 呼び出しアダプターをサポートします: Call、RxJava Observable、RxJava2 Observable、Flowable。
- リモート サービス コールバック メカニズムをサポートします。
- AIDL のすべてのデータ型をサポートします。
- AIDL のすべてのデータ方向タグ (in、out、inout) をサポートします。
- oneway キーワードは AIDL をサポートします。
4. 使い方@RemoteInterface アノテーションを使用して、リモート サービス インターフェイス IRemoteService を装飾し、実装します。 - @リモートインターフェース
- パブリックインターフェイス IRemoteService {
-
- 整数getPid();
-
- void basicTypes( int anInt, long aLong, boolean aBoolean, float aFloat,
- ダブルaDouble、文字列 aString);
-
- void registerCallback(@Callback IRemoteCallback コールバック);
-
- void 方向パラメータメソッド( @In int [] arr、@ Out ParcelableObj obj、@Inout Rect rect);
-
- @一方通行
- void onewayMethod(文字列メッセージ);
- }
サーバーサイドアプリで、AndLinkerBinderオブジェクトを作成し、上記のインターフェース実装を登録します。そして、それをonBind()メソッドで返してクライアントに公開します。 - プライベート AndLinkerBinder mLinkerBinder;
- @オーバーライド
- パブリックvoid onStart(インテント インテント) {
- super.onStart(インテント);
- HiLog.debug(ラベル、 「サービスonCreate()」 );
- mLinkerBinder = AndLinkerBinder.Factory.newBinder();
- mLinkerBinder.registerObject(mRemoteService);
- mLinkerBinder.registerObject(mRemoteTask);
- }
-
- @オーバーライド
- パブリックIRemoteObject onConnect(インテントインテント) {
- HiLog.debug(ラベル、 「サービスonBind()」 );
- (IRemoteObject) mLinkerBinder を返します。
- }
クライアント アプリケーションでは、Builder メソッドを使用して AndLinker オブジェクトが作成され、create() メソッドを使用して IRemoteService リモート インターフェイスの IPC 実装が生成されます。 - パブリッククラス MainAbilitySlice は AbilitySlice を拡張し、AndLinker.BindCallback、Component.ClickedListener を実装します{
- プライベート静的最終文字列 TAG = "BindingActivity" ;
- プライベート静的最終文字列 REMOTE_SERVICE_PKG = "com.example.andlinker" ;
- 公共 静的最終文字列 REMOTE_SERVICE_ACTION = "com.example.andlinker.REMOTE_SERVICE_ACTION" ;
- プライベート HiLogLabel ラベル = 新しい HiLogLabel(HiLog.ERROR,0,TAG);
- プライベート IRemoteTask mRemoteTask;
- プライベート IRemoteService mRemoteService;
- プライベート AndLinker mLinker;
-
- @オーバーライド
- パブリックvoid onStart(インテント インテント) {
- super.onStart(インテント);
- super.setUIContent(ResourceTable.Layout_ability_main);
- mLinker = 新しい AndLinker.Builder(これ)
- .パッケージ名(REMOTE_SERVICE_PKG)
- .アクション(REMOTE_SERVICE_ACTION)
- .className( "com.example.andlinker.RemoteService" )
- .addCallAdapterFactory( OriginalCallAdapterFactory.create ()) // 基本
- .addCallAdapterFactory( RxJava2CallAdapterFactory.create ()) // RxJava2
- 。建てる();
- mLinker.setBindCallback(これ);
- mLinker.registerObject(mRemoteCallback);
- mlinker.bind();
- }
これで、mRemoteService オブジェクト内のすべてのメソッドは IPC メソッドになりました。 基本的な使い方 - 効果のデモンストレーション AndLinker はすべての AIDL データ型をサポートしています。 - Java 言語のすべてのプリミティブ型: int、long、char、boolean など。
- 弦
- 文字シーケンス
- パラセラブル
- リスト(リスト内のすべての要素は、このリストでサポートされているデータ型である必要があります)
- マップ (マップ内のすべての要素は、このリストでサポートされているデータ型である必要があります)
- ボタン buttonBtnPid = (Button) findComponentById(ResourceTable.Id_btn_pid);
- buttonBtnPid.setClickedListener(新しいComponent.ClickedListener() {
- @オーバーライド
- パブリックvoid onClick(コンポーネント コンポーネント) {
- ToastDialog ダイアログ = 新しい ToastDialog(MainAbilitySlice.this);
- dialog.setText( "サーバーPID: " + mRemoteService.getPid()).show();
- }
- });
-
- ボタン buttonBtnBasicTypes = (Button) findComponentById(ResourceTable.Id_btn_basic_types);
- buttonBtnBasicTypes.setClickedListener(新しいComponent.ClickedListener() {
- @オーバーライド
- パブリックvoid onClick(コンポーネント コンポーネント) {
- mRemoteService.basicTypes(1, 2L, true , 3.0f, 4.0d, "str" );
- }
- });
高度な使い方 - 効果のデモンストレーション 1. コールアダプタクライアント アプリケーションでは、リモート サービス インターフェイスとラッパー メソッドの戻り値をコピーおよび変更できます。 - @リモートインターフェース
- パブリックインターフェイス IRemoteService {
-
- 整数getPid();
-
- void basicTypes( int anInt, long aLong, boolean aBoolean, float aFloat,
- ダブルaDouble、文字列 aString);
-
- void registerCallback(@Callback IRemoteCallback コールバック);
-
- void 方向パラメータメソッド( @In int [] arr、@ Out ParcelableObj obj、@Inout Rect rect);
-
- @一方通行
- void onewayMethod(文字列メッセージ);
- }
対応する呼び出しアダプタ ファクトリを AndLinker.Builder に登録します。 - パブリッククラス MainAbilitySlice は AbilitySlice を拡張し、AndLinker.BindCallback、Component.ClickedListener を実装します{
- プライベート静的最終文字列 TAG = "BindingActivity" ;
- プライベート静的最終文字列 REMOTE_SERVICE_PKG = "com.example.andlinker" ;
- 公共 静的最終文字列 REMOTE_SERVICE_ACTION = "com.example.andlinker.REMOTE_SERVICE_ACTION" ;
- プライベート HiLogLabel ラベル = 新しい HiLogLabel(HiLog.ERROR,0,TAG);
- プライベート IRemoteTask mRemoteTask;
- プライベート IRemoteService mRemoteService;
- プライベート AndLinker mLinker;
-
- @オーバーライド
- パブリックvoid onStart(インテント インテント) {
- super.onStart(インテント);
- super.setUIContent(ResourceTable.Layout_ability_main);
- mLinker = 新しい AndLinker.Builder(これ)
- .パッケージ名(REMOTE_SERVICE_PKG)
- .アクション(REMOTE_SERVICE_ACTION)
- .className( "com.example.andlinker.RemoteService" )
- .addCallAdapterFactory( OriginalCallAdapterFactory.create ()) // 基本
- .addCallAdapterFactory( RxJava2CallAdapterFactory.create ()) // RxJava2
- 。建てる();
- mLinker.setBindCallback(これ);
- mLinker.registerObject(mRemoteCallback);
- mlinker.bind();
- }
2. リモートサービスインターフェースコールバック@RemoteInterface アノテーションを使用して、リモート サービスのコールバック インターフェイス IRemoteCallback を装飾します。 - @リモートインターフェース
- パブリックインターフェイス IRemoteCallback {
-
- void onStart();
-
- void onValueChange( int値);
- }
@Callback アノテーションを使用して、リモート メソッドのコールバック パラメータを装飾します。 - void registerCallback(@Callback IRemoteCallback コールバック);
クライアント アプリケーションで、上で定義したリモート サービス コールバック インターフェイス IRemateCallback を実装し、AndLinker に登録します。 - プライベートファイナルIRemoteCallback mRemoteCallback = 新しいIRemoteCallback() {
-
- @オーバーライド
- パブリックvoid onStart() {
- HiLog.debug(label, "サーバーコールバック onStart!" );
- }
-
- @オーバーライド
- パブリックvoid onValueChange( int値) {
- //サーバー側のコールバックを呼び出す
- ToastDialog ダイアログ = 新しい ToastDialog(MainAbilitySlice.this);
- ダイアログのサイズを 1000,200 に設定します。
- dialog.setText( "サーバーコールバック値: " + value).show();
- }
- };
3. データターゲティングタグを指定するリモート メソッドのパラメーターに @In、@Out、または @Inout アノテーションを指定して、基礎となるビルダー内のデータ フローをマークできます。 - 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アノテーションを使用すると、リモートメソッド呼び出しの動作が変更されます。このアノテーションを使用すると、リモートメソッド呼び出しはブロックされず、単にデータを送信してすぐに戻ります。 - @一方通行
- 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 |