AIDL (Android Interface Definition Language)은 Android 인터페이스 정의 언어입니다.
최근에 Binder의 원리를 살펴 보았는데, Android에서 AIDL은 Binder의 고전적인 구현입니다. 먼저 AIDL을 사용하는 단계를 기록해 두십시오.
1 서버 서비스
1.1 AndroidStudio를 사용하여 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 서비스 구현 클래스 생성
Service를 구현할 클래스를 생성합니다. 위치 디렉토리는 다음과 같습니다.
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를 선언하는 것을 잊지 마십시오.
<service android:name=".OperateNumService">
<intent-filter>
<action android:name="com.aidl_service_demo.my_flag" />
</intent-filter>
</service>
여기서 서버가 완성되었습니다.
2 클라이언트
2.1 서버의 aidl 폴더를 Client 디렉토리에 직접 복사합니다.
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 먼저 Bind Service 버튼을 클릭하면 클라이언트가 다음과 같이 로그를 인쇄합니다.
2 그런 다음 서비스에 데이터 보내기 버튼을 클릭합니다.
서비스 로그는 다음과 같습니다.
클라이언트 인터페이스는 다음과 같이 표시됩니다.