1. 创建 AIDL 文件
在 app/src/main/aidl/com/example/myapp 目录下创建 IMyAidlInterface.aidl 文件:
// IMyAidlInterface.aidl
package com.example.myapp;
interface IMyAidlInterface {
// 定义接口方法
int add(int a, int b);
String toUpperCase(String input);
}
编译后,Android Studio 会自动生成对应的 Java 接口(如 IMyAidlInterface.java)。
2. 实现 Service
创建一个 Service 并实现 AIDL 接口:
// MyAidlService.java
public class MyAidlService extends Service {
private final IMyAidlInterface.Stub binder = new IMyAidlInterface.Stub() {
@Override
public int add(int a, int b) throws RemoteException {
return a + b;
}
@Override
public String toUpperCase(String input) throws RemoteException {
return input != null ? input.toUpperCase() : "";
}
};
@Override
public IBinder onBind(Intent intent) {
return binder;
}
}
3. 配置 Service
在 AndroidManifest.xml 中声明 Service,并设置独立进程(模拟跨进程场景):
<service
android:name=".MyAidlService"
android:process=":remote" /> <!-- 运行在独立进程 -->
4. 客户端绑定 Service
在 Activity 中绑定服务并调用远程方法:
// MainActivity.java
public class MainActivity extends AppCompatActivity {
private IMyAidlInterface myAidlInterface;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myAidlInterface = IMyAidlInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
myAidlInterface = null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 绑定服务
Intent intent = new Intent(this, MyAidlService.class);
bindService(intent, connection, Context.BIND_AUTO_CREATE);
// 调用远程方法示例
findViewById(R.id.btn_add).setOnClickListener(v -> {
try {
if (myAidlInterface != null) {
int result = myAidlInterface.add(5, 3);
Toast.makeText(this, "5 + 3 = " + result, Toast.LENGTH_SHORT).show();
}
} catch (RemoteException e) {
e.printStackTrace();
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(connection); // 解绑服务
}
}
5. 处理自定义对象(可选)
若需传递自定义对象(如 User),需实现Parcelable 接口并定义对应 AIDL:
1. 定义 User 类:
// User.java
public class User implements Parcelable {
private String name;
public User(String name) { this.name = name; }
protected User(Parcel in) { name = in.readString(); }
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) { return new User(in); }
@Override
public User[] newArray(int size) { return new User[size]; }
};
@Override
public int describeContents() { return 0; }
@Override
public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); }
public String getName() { return name; }
}
2. 创建 User.aidl:
// User.aidl
package com.example.myapp;
parcelable User;
3. 在接口中传递 User:
// IMyAidlInterface.aidl
import com.example.myapp.User;
interface IMyAidlInterface {
void updateUser(in User user);
}
关键点总结
AIDL 文件路径:必须放在 aidl 目录下,包名与 Java 代码一致。
跨进程数据类型:支持基本类型、String、List、Map 和 Parcelable 对象。
异常处理:所有远程方法调用需捕获 RemoteException。
线程安全:服务端方法默认运行在 Binder 线程池,需自行处理线程同步。
通过这个例子,你可以快速理解 AIDL 的基本使用流程。实际开发中可根据需求扩展接口方法。