目次
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 インターフェイスのプロキシ オブジェクトに変換します。これにより、リモート呼び出し要求を開始できます。
参照文書: