阅读项目源码的过程中,很多基于AIDL的代码还是看不太明白,基于项目中一处RemoteCallbackList的使用,搜索到以下的相关文章,做了学习和实践。本文包括AIDL基本使用和RemoteCallbackList使用两方面。
一、学习AIDIL使用
参考文章地址:https://www.jianshu.com/p/2683e27efe9a
1、基础操作
1)调试AIDLClient时,AIDLService开启,才是进程间通信环境;
不然bindService调用后没有回调,mICalculateInterface是null。
2、自定义类型
1)Person类和对应的aidl结构如图,Person.aidl命名时提示文件名唯一性问题:先用别的名字,生成文件后再改写
2)ICalculateInterface中使用Person的时候,需要手动加入
import com.example.dongyanyz.aidlservice.Person;
不然build后,会报错:Error:aidl.exe E 07-24 10:29:29 7972 15992 type_namespace.cpp:107] unknown type
3)CopyOnWriteArrayList(读操作性能高,写操作加锁:适用于多客户端连接服务器时自动处理多线程同步问题)。
参考文章地址:https://www.jianshu.com/p/9b6a4d0b94ac
4)AIDLService中自定义类和对应的aidl文件复制到AIDLClient中,目录如下,注意包名,类同步到java目录里,aidl同步到aidl目录里。
二、AIDL中的RemoteCallbackList使用
1、在AIDL文件中增加设置监听器时所需的接口,也必须时AIDL形式的接口。
2、监听器IOnNewPersonArrivedListener,客户端采用new IOnNewPersonArrivedListener.Stub()实例化。
3、IOnNewPersonArrivedListener中,如下方法可删除,若是删除确保客户端/服务端均删除, IOnNewPersonArrivedListener代码一致。
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,double aDouble, String aString);
4、AtomicBoolean线程安全,功能与boolean一致,但boolean线程不安全,只能保证当时值,而实际会有F/T两种值。多线程不安全。