进程间通信
实现进程间通信的方式有哪些?
1. 广播(broadcast)
2. 文件读写
3. startActivity隐式调用
4. aidl
5. …
AIDL
- AIDL是一种接口定义语言,用于约束两个进程间的通信规则,供编译器生成代码,实现Android 设备上的进程间通信。
- 官方文档特别提醒我们何时使用AIDL是必要的:只有你允许客户端从不同的应用程序为了进程间的通信而去访问你的service,以及想在你的service处理多线程。
服务(被调用)
- 创建.aidl文件,该文件中定义调用接口。
- AIDL使用简单的语法来声明接口,描述其方法以及方法的参数和返回值。这些参数和返回值可以是任何类型,甚至是其他AIDL生成的接口。
- 其中对于Java编程语言的基本数据类型 (int, long, char, boolean等),String和CharSequence,集合接口类型List和Map,不需要import 语句。
- 而如果需要在AIDL中使用其他AIDL接口类型,需要import,即使是在相同包结构下。AIDL允许传递实现Parcelable接口的类,需要import. 需要特别注意的是,对于非基本数据类型,也不是String和CharSequence类型的,需要有方向指示,包括in、out和inout,in表示由客户端设置,out表示由服务端设置,inout是两者均可设置。
- AIDL只支持接口方法,不能公开static变量。
- 实现aidl接口。
- 创建service,返回aidl实现的binder。
客户端调用
- 将服务端aidl文件拷贝至客户端,确保接口一致。
- 使用bindservice方式,在serviceconnection中获取aidl实现类
注意:
1. 调用者是不能保证在主线程执行的,所以从一调用的开始就需要考虑多线程处理,以及确保线程安全。
2. IPC调用是同步的。如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity的主线程中调用。也就是IPC调用会挂起应用程序导致界面失去响应,这种情况应该考虑单独开启一个线程来处理。
3. 抛出的异常是不能返回给调用者(跨进程抛异常处理是不可取的)。