Android(安卓)Studio使用aidl实现进程间通信
16lz
2021-01-25
使用aidl自动生成IBinder接口
aild的写法:
1.package 包名;
2.import <任何非默认类型的类,包括同一包下的>;
3.接口中的数据类型只能是:
- 基本数据类型,String和CharSequence,List(ArrayList),Map(HashMap),Parcelable,AIDL
若用到自定义的Parcelable类,需要新建同名aidl文件
// Book.aidlimport com.gaoxiang.android.test.aidl;parcelable Book;
// Book.javapackage com.gaoxiang.android.test.aidl;import android.os.Parcel;import android.os.Parcelable;public class Book implements Parcelable { // 省略}
- 除了基本数据类型,其他类型的参数必须标上方向:in(输入型), out(输出型), inout(输入输出型)
aidl接口只支持方法,不支持声明静态常量
// IBookManager.aidlinterface IBookManager { List
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 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接口的实现类
@Overridepublic 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/
更多相关文章
- 6.9 Android(安卓)支付宝 开发者平台申请和接口调用
- Android(安卓)补间动画使用记录
- Android完美处理RecyclerView实现item条目点击事件处理
- Android2.2添加Ethernet 框架支持(一)
- Android(安卓)进程间通信AIDL学习
- ①Android(安卓)NuPlayer播放框架
- Android(安卓)MVP 模式应用实例
- Android(安卓)Java(2015-6-18 15:28、2016-1-30 21:18、2016-5-31
- android studio 中好用的插件————你值的拥有