AIDL定义
AIDL (Android Interface Definition Language) 是一种接口定义语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数,来完成进程间通信。
AIDL的用法
AIDL的实现一共分为三部分,一部分是客户端,调用远程服务。一部分是服务端,提供服务。最后一部分,也是最关键的是AIDL接口,用来传递的参数,提供进程间通信。
第一步 创建Aidl文件
在aidl文件 写两个方法
interface IBinderPool {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void setId(int id);
int getId();
}
makePro之后,系统会自动根据aidl生成对应的接口
public interface IBinderPool extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements com.yihui.testactivity.IBinderPool
{
第二步 创建一个service
public class testService extends Service {
private int id;
@Override
public IBinder onBind(Intent intent) {
return iBinder;
}
private IBinder iBinder = new IBinderPool.Stub() {
@Override
public void setId(int iid) throws RemoteException {
id =iid;
}
@Override
public int getId() throws RemoteException {
return id;
}
};
}
设置service的进程,用来模拟跨进城访问
<activity
android:name=".MainActivity"
android:process=":test">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
第三步
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iBinderPool = IBinderPool.Stub.asInterface(service);
try {
tv_two_name.setText(iBinderPool.getId()+"");
Log.i("TwoActivity","first:" + iBinderPool.getId());
iBinderPool.setId(777777);
Log.i("TwoActivity","next:" + iBinderPool.getId());
}catch (RemoteException e){
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
Intent intent = new Intent(ServiceActivity1.this, testService.class);
bindService(intent, connection, Context.BIND_AUTO_CREATE);
tv_two_name.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
iBinderPool.setId(111111);
tv_two_name.setText(iBinderPool.getId()+"");
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
aidl 的底层其实是使用Binder机制