1、创建AIDL文件夹及文件,点击app > New > AIDL > AIDL File
2、将IMyAidlInterface删除后,在AIDL包内(该包文件夹结构与项目文件夹结构相同)创建Student.aidl和IStudentManager.aidl
3、编写Student.java,因为要该类的数据要跨进程传输所以要实现Parcelable接口。
import android.os.Parcel;
import android.os.Parcelable;
public class Student implements Parcelable {
public int studentNumber;
public String studentName;
public Student(int studentNumber, String studentName) {
this.studentNumber = studentNumber;
this.studentName = studentName;
}
public Student(Parcel source) {
studentNumber = source.readInt();
studentName = source.readString();
}
public static final Creator<Student> CREATOR = new Creator<Student>(){
@Override
public Student createFromParcel(Parcel source) {
return new Student(source);
}
@Override
public Student[] newArray(int size) {
return new Student[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(studentNumber);
dest.writeString(studentName);
}
@Override
public String toString() {
return "Student :" +
"studentNumber=" + studentNumber +
", studentName='" + studentName + '\'';
}
}
4、编写Student.aidl,每个实现了Parcelable接口的类都要创建相应的aidl文件并将该类声明为Parcelable,以确保能跨进程传输,要手动加入完整包名,该包名是aidl下的包名。
4、编写StudentManager.aidl,声明一些操作数据的方法,in表示为输入型参数,out表示输出型参数,inout表示输入输出型参数,import进来的类是aidl下的类。
5、Rebuild project,将文件浏览模式切换为“Android”,如果在java(generated)目录下看得到自动生成的文件的话,说明AIDL文件创建成功。
6、编写服务端,StudentManagerService.java
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import androidx.annotation.Nullable;
import com.example.mydemos.IStudentManager;
import com.example.mydemos.bean.Student;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class StudentManagerService extends Service {
private static final String TAG = "Aidl-Service";
// CopyOnWriteArrayList支持并发读写,自动进行线程同步
private CopyOnWriteArrayList<Student> mStudentList = new CopyOnWriteArrayList();
// Binder对象用来与客户端通信
private Binder mBinder = new IStudentManager.Stub() {
@Override
public List<Student> getStudentList() throws RemoteException {
return mStudentList;
}
@Override
public boolean addStudent(Student student) throws RemoteException {
return mStudentList.add(student);
}
};
@Override
public void onCreate() {
super.onCreate();
mStudentList.add(new Student(1000, "凌某"));
mStudentList.add(new Student(1002, "刘某"));
}
// 将Binder对象返回给客户端
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onDestroy() {
super.onDestroy();
running = false;
}
}
7、编写客户端,AidlActivity.java
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
import androidx.annotation.NonNull;
import com.example.mydemos.IStudentManager;
import com.example.mydemos.R;
import com.example.mydemos.base.BaseActivityForLog;
import com.example.mydemos.bean.Student;
import org.jetbrains.annotations.NotNull;
import java.lang.ref.WeakReference;
import java.util.List;
public class AidlActivity extends BaseActivityForLog {
private static final String TAG = "Aidl-Client";
private IStudentManager studentManager;
private Handler myHandler;
// The ServiceConnection object is used to establish a connection with the server
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 将Binder对象转换成服务端的StudentManager对象,用以远程调用方法。
studentManager = IStudentManager.Stub.asInterface(service);
StringBuilder stringBuilder = new StringBuilder();
try {
List<Student> list = studentManager.getStudentList();
Log.d(TAG, "onServiceConnected: query student list, list type is" + list.getClass().getCanonicalName());
for (Student student : list)
stringBuilder.append(student.studentName).append(",");
addLog("query student list from server, student is " + stringBuilder.toString());
Log.d(TAG, "onServiceConnected: query student list : " + list.toString());
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
studentManager = null;
}
};
@NotNull
@Override
public String setTitle() {
return "AidlActivity";
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 启动Aidl服务端
Intent intent = new Intent(this, StudentManagerService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
addLog(getString(R.string.see_server));
myHandler = new MyHandler(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(mConnection);
}
private static class MyHandler extends Handler {
WeakReference<Activity> activityWeakReference;
MyHandler(Activity activity) {
activityWeakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
BaseActivityForLog activity = (BaseActivityForLog) activityWeakReference.get();
String m = (String) msg.obj;
activity.addLog("onNewStudentArrived " + m);
}
}
}
8、在AndroidManifest.xml中添加BookManagerService
<service
android:name=".yishutansuo.ipc.aidl.StudentManagerService"
android:process=":aidl_server" />