使用aidl自动生成IBinder接口
aild的写法:
1.package 包名;
2.import <任何非默认类型的类,包括同一包下的>;
3.接口中的数据类型只能是:
- 基本数据类型,String和CharSequence,List(ArrayList),Map(HashMap),Parcelable,AIDL
若用到自定义的Parcelable类,需要新建同名aidl文件
// Book.aidl import com.gaoxiang.android.test.aidl; parcelable Book;
// Book.java package com.gaoxiang.android.test.aidl; import android.os.Parcel; import android.os.Parcelable; public class Book implements Parcelable { // 省略 }
- 除了基本数据类型,其他类型的参数必须标上方向:in(输入型), out(输出型), inout(输入输出型)
aidl接口只支持方法,不支持声明静态常量
// IBookManager.aidl interface IBookManager { List<Book> getBookList(); void addBook(in Book book); void registerListener(IOnNewBookArrivedListener listener); void unregisterListener(IOnNewBookArrivedListener listener); }
4.build之后,在同一包下,系统自动生成IBookManager.java
直接利用aidl方式实现IPC
aidl包:
首先新建aidl包,新建所需的Parcelable类,定义用到的aidl接口,build后自动生成aidl接口,将aidl
包复制到服务端应用和客户端应用。服务:
(1) anifest允许外部应用访问`android:exported=”true”
<service
android:name=".service.BookManagerService"
android:enabled="true"
android:exported="true"
android:process=":remote">
</service>
(2) 定义实例实现aidl接口中的抽象方法
private Binder mBinder = new IBookManager.Stub() {
@Override
public List<Book> getBookList() throws RemoteException {
return mBookList;
}
@Override
public void addBook(Book book) throws RemoteException {
mBookList.add(book);
}
@Override
public void registerListener(IOnNewBookArrivedListener listener) throws RemoteException {
mListenerList.register(listener);
}
@Override
public void unregisterListener(IOnNewBookArrivedListener listener) throws RemoteException {
mListenerList.unregister(listener);
}
};
(3) 重写IBinder onBind(Intent)
方法,返回aidl接口的实现类
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
- 客户端:
(1) 新建ServiceConnection实例,实现onServiceConnected()
public void onServiceConnected(ComponentName name, IBinder service) {
// 通过asInterfac(IBinder)获得服务端的aidl接口的实现类
mBinderPool = IBinderPool.Stub.asInterface(service);
// 省略
}
(2) 绑定服务
Intent intent = new Intent();
// 应用包名,和服务包名
intent.setComponent(new ComponentName("com.gaoxiang.android.test",
"com.gaoxiang.android.test.service.BookManagerService"));
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
参考资料
[1] 《Android开发艺术探索》, 任玉刚. https://book.douban.com/subject/26599538/