1、创建AIDL文件夹及文件,点击app > New > AIDL > AIDL File
2、将IMyAidlInterface删除后,在AIDL包内(该包文件夹结构与项目文件夹结构相同)创建Student.aidl和StudentManager.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,AIDL中每个实现了Parcelable接口的类都要创建相应的文件并将该类声明为Parcelable。要手动加入完整包名。
4、编写StudentManager.aidl,声明一些操作数据的方法,in表示为输入型参数,out表示输出型参数,inout表示输入输出型参数。
5、Rebuild project,将文件浏览模式切换为“Android”,如果在java(generated)目录下看得到自动生成的文件的话,说明AIDL文件创建成功。
6、编写服务端,BookManagerService.java
public class BookManagerService extends Service {
private static final String TAG = "BookManagerService";
// CopyOnWriteArrayList支持并发读写,自动进行线程同步
private CopyOnWriteArrayList<Student> mStudentList = new CopyOnWriteArrayList();
// Binder对象用来与客户端通信
private Binder mBinder = new StudentManager.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;
}
}
7、编写客户端,AidlActivity.java
package com.example.interview2.ipc.aidl;
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 androidx.appcompat.app.AppCompatActivity;
import com.example.interview2.Student;
import com.example.interview2.R;
import com.example.interview2.StudentManager;
import java.util.List;
public class AidlActivity extends AppCompatActivity {
private static final String TAG = "AidlActivity";
private StudentManager studentManager;
// ServiceConnection对象用以和服务端建立连接
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 将Binder对象转换成服务端的StudentManager对象,用以远程调用方法。
studentManager = StudentManager.Stub.asInterface(service);
try {
List<Student> list = studentManager.getStudentList();
Log.d(TAG, "onServiceConnected: query book list, list type is"+list.getClass().getCanonicalName());
Log.d(TAG, "onServiceConnected: query book list : "+list.toString());
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
studentManager=null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 启动服务端
Intent intent = new Intent(this, BookManagerService.class);
bindService(intent,mConnection,Context.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
unbindService(mConnection);
super.onDestroy();
}
// 测试添加数据
public void onClick(View v) {
try {
Student student = new Student(1003, "廖某");
boolean b = studentManager.addStudent(student);
if (b) {
List<Student> list = studentManager.getStudentList();
Log.d(TAG, "onServiceConnected: query student list, list type is"+list.toString());
}
}catch (Exception e){
}
}
}
8、在AndroidManifest.xml中添加BookManagerService
<service
android:name=".ipc.aidl.BookManagerService"
android:process=":remote2">
</service>