需求:
客户端通过AIDL传一段文件流给服务端,服务端根据流还原生成文件并打开
前置条件:
不赘述AIDL的使用方法
示例代码不做详细的容错处理
想法:
如果要通过AIDL把一个文件流传输到另一端,临时可以想得到的一个方法是:
client端的线程通过FileInputStream每次read一个缓冲,通过AIDL相应的去调用server端的方法,把这个缓冲区的byte数组传递到server端,然后server端通过FileOutputStream把这些byte数组write到新生成的临时文件即可。
但这种方法的弊端就是在文件传输期间会阻塞server端。众所周知,service是运行在应用的主线程中的,如果service中出现了很多不在其子线程中运行的阻塞或耗时操作,肯定会影响整个应用的流畅性的,所以这种方法不可行。
解决方法:
问题的关键是如何把接收的过程放到server端的线程中?解决方法是使用管道!但是Android进程间通信用Binder来传递数据,有一个最基本的要求就是要实现Parcelable接口。所以这里就需要用到:
ParcelFileDescriptor[] pfd = ParcelFileDescriptor.createPipe();
pfd[0]是管道的read端
pfd[1]是管道的write端
简单流程说明:
客户端:
先把pfd[0]通过AIDL调用传输给服务端,然后
ParcelFileDescriptor.AutoCloseOutputStream aos =