在 Android 系统中,AIDL(Android Interface Definition Language)是用于实现进程间通信(IPC)的工具,允许不同进程中的组件相互调用方法。aidl_client_server.zip 包含了 AIDL 的示例,分为服务端(ServerTest)和客户端(ClientTest)两部分。

AIDL 的基本原理是定义接口,声明可供服务端和客户端间调用的方法。Android 编译器会根据 AIDL 文件生成对应的 Java 代码,使得服务端可以实现接口,而客户端通过 Binder 机制调用远程服务端的方法。

在 ServerTest 中,首先定义 AIDL 文件,如 IService.aidl,包含如下内容:

package com.example.aidldemo;
interface IService {
void sendData(int data);
int receiveData();
}

此接口声明了 sendDatareceiveData 两个方法,用于数据传输。编译后,Android 会生成相应的 Java 类,服务端实现接口并启动服务:

public class Service extends android.app.Service {
private IService.Stub binder = new IService.Stub() {
@Override
public void sendData(int data) {
// 实现数据发送逻辑
}
@Override
public int receiveData() {
// 实现数据接收逻辑
return 0;
}
};
@Override
public IBinder onBind(Intent intent) {
return binder;
}
}

服务端需在 AndroidManifest.xml 中注册 Service,并设置 android:process 属性,以便在不同进程中运行:

<service android:name=".Service" android:process=":remote">
<intent-filter>
<action android:name="com.example.aidldemo.ISERVICE" />
</intent-filter>
</service>

在 ClientTest 中,客户端通过 Intent 绑定到服务端的 Service,获取到 IService 的 IBinder 实例,之后可以调用远程服务的方法:

public class MainActivity extends AppCompatActivity {
private IService.Stub binder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.example.aidldemo", "com.example.aidldemo.Service"));
bindService(intent, connection, Context.BIND_AUTO_CREATE);
}
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder = IService.Stub.asInterface(service);
try {
binder.sendData(123); // 调用服务端方法
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
binder = null;
}
};
}

通过绑定 Service 并与之交互,ClientTest 演示了如何通过 AIDL 实现跨进程的数据通信。ServerTest 提供了实现 AIDL 接口的服务,展示了服务端如何与客户端进行交互。这种方式广泛应用于 Android 系统中,解决了不同应用程序或同一应用的不同组件间的通信问题。