AIDL(Androidインターフェース定義言語)は、Androidインターフェース定義言語です。
最近、バインダーの原理を見ていました。Androidでは、AIDLはバインダーの古典的な実装です。まず、AIDLを使用する手順を記録します。
1サーバーサービス
1.1AndroidStudioを使用してaidlファイルを作成する
次に、ファイル名を変更できるページがポップアップし、ファイル名を自分で取得できます
[完了]をクリックすると、aidlファイルディレクトリは次のようになります。
次に、aidlフォルダーディレクトリを開き、作成したばかりのOperateNumInterface.aidlファイルを開きます。
その中で、NumBeanは新しく作成されたJavaクラスであり、ディレクトリは次のとおりです。
NumBeanはParcelableインターフェースを実装する必要があります。完全なコードは次のとおりです。
package com.sz.aidl_service_demo;
import android.os.Parcel;
import android.os.Parcelable;
public class NumBean implements Parcelable {
private String extraInfo;
private int num1;
private int num2;
public NumBean(int num1, int num2, String extraInfo) {
this.num1 = num1;
this.num2 = num2;
this.extraInfo = extraInfo;
}
protected NumBean(Parcel parcel) {
num1 = parcel.readInt();
num2 = parcel.readInt();
extraInfo = parcel.readString();
}
public String getExtraInfo() {
return extraInfo;
}
public void setExtraInfo(String extraInfo) {
this.extraInfo = extraInfo;
}
public int getNum1() {
return num1;
}
public void setNum1(int num1) {
this.num1 = num1;
}
public int getNum2() {
return num2;
}
public void setNum2(int num2) {
this.num2 = num2;
}
public static final
Creator<NumBean> CREATOR = new Creator<NumBean>() {
@Override
public NumBean createFromParcel(Parcel source) {
return new NumBean(source);
}
@Override
public NumBean[] newArray(int size) {
return new NumBean[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(num1);
dest.writeInt(num2);
dest.writeString(extraInfo);
}
}
次に、図に示すように、aidlフォルダーにNumBean.adilファイルを作成します。
このとき、OperateNumInterface.javaファイルを生成するためにプロジェクトを再構築する必要があります。ビルドが成功すると、次のディレクトリが表示されます。
1.2サービス実装クラスを作成する
サービスを実装するクラスを作成します。ロケーションディレクトリは次のとおりです。
OperateNumService.javaの詳細コード:
package com.sz.aidl_service_demo;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import androidx.annotation.Nullable;
public class OperateNumService extends Service {
注释1:一定要先ReBuild项目,否则找不到OperateNumInterface
private IBinder iBinder = new OperateNumInterface.Stub() {
@Override
public int operateNum(NumBean numBean) throws RemoteException {
注释2:还记得aidl文件中我们自己定义的方法么,具体实现在这里
Log.i("tag", "num1=" + numBean.getNum1() + ",num2=" + numBean.getNum2() + ",ExtraInfo=" + numBean.getExtraInfo());
return numBean.getNum1() + numBean.getNum2();//我是将NumBean中两个数的和返回
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
return iBinder;
}
}
次に、Mainfestファイルでサービスを宣言することを忘れないでください。
<service android:name=".OperateNumService">
<intent-filter>
<action android:name="com.aidl_service_demo.my_flag" />
</intent-filter>
</service>
サーバーはここで終了します。
2クライアント
2.1サーバーのaidlフォルダーをクライアントディレクトリに直接コピーします
2.2新しいNumBeanクラス
NumBeanクラスのディレクトリ構造は、サービス側のディレクトリ構造と同じである必要があることに注意してください。
プロジェクトを再構築する必要があることに注意してください
2.3サービスをバインドし、データを送信して結果を送受信します
これらの操作はMainActivityで実行され、コードは次のとおりです。
import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import com.sz.aidl_service_demo.NumBean;
import com.sz.aidl_service_demo.OperateNumInterface;
public class MainActivity extends AppCompatActivity {
private TextView tv_operate_num_result;
private int operateResult = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_operate_num_result = findViewById(R.id.tv_operate_num_result);
}
注释1:按钮1 绑定Service
public void bindService(View view) {
Intent intentBind = new Intent();
intentBind.setAction("com.aidl_service_demo.my_flag");
intentBind.setPackage("com.sz.aidl_service_demo");
bindService(intentBind, serviceConnection, Context.BIND_AUTO_CREATE);
}
注释2:按钮2 向Service发送数据并接收返回数据展示
public void sendService(View view) {
NumBean numBean = new NumBean(160, 8, "i'm extra info");
if (operateNumInterface != null) {
try {
operateResult = operateNumInterface.operateNum(numBean);
} catch (RemoteException e) {
e.printStackTrace();
}
}
tv_operate_num_result.setText("Service 返回操作结果为: " + operateResult);
}
private OperateNumInterface operateNumInterface;
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("tag", "onServiceConnected");
注释3:
operateNumInterface = OperateNumInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
operateNumInterface = null;
}
};
}
1最初に[バインドサービス]ボタンをクリックすると、クライアントは次のようにログを印刷します。
2次に、[データをサービスに送信]ボタンをクリックします
サービスログは次のとおりです。
クライアントインターフェイスは次のように表示されます。