AIDL の使用の概要

目次

AIDL

サーバーの使い方

クライアントの使い方

 


AIDL

AIDL (Android Interface Define Language) は IPC 通信方法です。これを使用して、2 つのプロセスが相互に通信するためのインターフェイスを定義できます。その本質は、サーバーとクライアントを必要とする C/S アーキテクチャです。

サーバーの使い方

最初にモジュールをサーバーとして追加し、main ディレクトリの下に aidl ディレクトリを作成します。

aidl ファイル IMyAidlInterface.aidl の作成を開始し、aidl ファイルにインターフェイス メソッドを追加します。

interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);
    String getWord();
    void setWord(String word);
}

プログラムをコンパイルすると、自動的に生成された Java ファイルが Android モードの java(generated) ファイルに表示されます: IMyAidlInterface.java ファイル

Service クラスを記述し、匿名で実装された IMyAidlInterface.Stub のインスタンスである MyService 内に IBinder オブジェクトを宣言し、クライアントが呼び出す IMyAidlInterface.Stub インスタンスの aidl で宣言されたメソッドを実装します。

public class MyService extends Service {
    private static final String TAG = "MyService";
    private String myWord;

    private IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub() {
        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

        }

        @Override
        public String getWord() throws RemoteException {
            return myWord;
        }

        @Override
        public void setWord(String word) throws RemoteException {
            myWord = word;
            Log.d(TAG, "setWord:" + word);
        }
    };
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

クライアントの使い方

クライアントはサーバーと同じです。新しい aidl ディレクトリを作成し、サーバー上の aidl をクライアントにコピーします。クライアント上のコピーされた aidl ファイルパッケージ ディレクトリは、サーバーと一致している必要があることに注意してください。同時にプロジェクトをコンパイルします。クライアントが対応するJavaファイルも生成するように、コピー後の時間

ServiceConnection インターフェイスを実装し、bindService を呼び出してサービスをバインドし、生成された ServiceConnection インスタンスを渡します。onServiceConnected() の実装では、受信した IBinder インスタンス (名前付きサービス) が受信されます。XXX.Stub.asInterface((IBinder)service) を呼び出して、返されたパラメータを AIDL によって生成されたインターフェイス タイプに変換します。

 private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //返回的IBinder类型参数转换为 AIDL生成的接口类型
            mService = IMyAidlInterface.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            //断开服务
            mService = null;
        }
    };

 private void bindService() {
        Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.example.aidlserver", "com.example.aidlserver.MyService"));
        bindService(intent, connection, Context.BIND_AUTO_CREATE);
    }

IPC 呼び出しは、生成された AIDL インターフェイス インスタンスで対応するメソッドを呼び出すことによって実現できます。

Context.unbindService() を使用していないときにサービスをバインド解除します。

  @Override
  protected void onDestroy() {
    super.onDestroy();
    unbindService(mService);
  }

AIDL の使用法を要約すると、クライアント プロセスに Binder オブジェクトを提供するサービスがサーバーにあります。クライアントは、AIDL インターフェイスの静的メソッド asInterface を介して Binder オブジェクトを AIDL インターフェイスのプロキシ オブジェクトに変換します。これにより、リモート呼び出し要求を開始できます。

参照文書:

AIDL 使用の詳細な説明と原則 - 短い本 (jianshu.com)

おすすめ

転載: blog.csdn.net/weixin_43858011/article/details/127240002