前言
AIDL是Android SDK提供的使用进程通信的机制。最常用的就是Service的进程通信了,这篇博客主要分析使用AIDL时,SDK生成的帮助完成进程通信的java文件。
AIDL简单使用
关于AIDL的使用,网上有很多很详细、完善的例子,这里就不多赘述了。直接上代码
首先,写一个aidl文件
IRemoteService.aidl
package com.example.aidldemo;
interface IRemoteService {
void addBook(String book);
List<String> getBook();
}
然后SDK就会生成下面这个同名java类,也是能够进程通信的关键
IRemoteService.java
package com.example.aidldemo;
public interface IRemoteService extends android.os.IInterface {
·······
}
接着是写一个Service
public class RemoteService extends Service {
private List<String> mBookList = new ArrayList<String>();
//创建一个Binder对象,也就是IRemoteService.Stub,
//并实现IRemoteService的方法
private IRemoteService.Stub mRemoteService = new IRemoteService.Stub() {
@Override
public void addBook(String book) throws RemoteException {
mBookList.add(book);
}
@Override
public List<String> getBook() throws RemoteException {
return mBookList;
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mRemoteService;
}
}
因为要使用进程通信,当然要让RemoteService运行在不同线程了
在AndroidManifest文件中注册为远程Service
<service android:name=".RemoteService"
android:process=":aidl"/>
然后在Activity中启动RemoteService
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e("aidl", "service connected");
mTextView.setText("service connect!");
//获得远程Service的代理
mBookManager = IRemoteService.Stub.asInterface(service);
if (mBookManager != null) {
try {
//调用远程Service
mBooks = mBookManager.getBook();
Log.e(getLocalClassName(), mBooks.toString());
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e("aidl", "service disconnected");
}
};
最后就可以直接使用了,效果如下
AIDL分析
前面我们先写了一个aidl文件,里面定义了一个我们想要的接口,SDK根据这个文件生成同名的java文件,在这个java文件内实现进程通信的相关内容。这个java文件就是这篇博客的主角。
现在进入正题,分析这个SDK生成java文件,看看它是如何完成进程通信的。
package