当前位置:   article > 正文

Android ParcelFileDescriptor实现进程间通信

Android ParcelFileDescriptor实现进程间通信
需求

一个通信通道,实现跨进程的的Socket网络通信。
具体的通信通道的图如下。

需求分析
  1. 我们需要一个进程一直做通信通道的事情,业务进程把数据通过进程间通信交给通信进程。
  2. 通信进程通过Socket通道将数据发给网络另外一端的通信进程。
  3. 接收端的通信进程把数据再交给业务进程。
android进程间通信基本方式

android进程间通信是使用Binder来传数据,而Binder传输的数据,有一个最为基本的要求,就是要实现Parcelable接口。

ParcelFileDescriptor

ParcelFileDescriptor是android提供的一个数据结构。

文件描述符,是一种程序读写已打开文件、socket的对象。

FileDescriptor对象,它代表了原始的Linux文件描述符
ParcelFileDescriptor对象,是原始文件描述符的一个复制,对象跟fd不同,但都是操作同一个底层文件流以及文件位置指针

  1. public class ParcelFileDescriptor
  2. extends Object implements Parcelable, Closeable

ParcelFileDescriptor是可以用于进程间Binder通信的FileDescriptor。支持stream 写入和stream 读出

  1. public static class ParcelFileDescriptor.AutoCloseInputStream
  2. extends FileInputStream
  3. public static class ParcelFileDescriptor.AutoCloseOutputStream
  4. extends FileOutputStream

我们可以使用

ParcelFileDescriptor open (File file, int mode)

来将PacecelFileDescriptor 与File对应起来,以实现进程间的文件共享。

我们也可以使用

ParcelFileDescriptor[] createPipe ()

来建立一个pipe通信通道,ParcelFileDescriptor数组第一个元素是read端,第二个元素是write端,通过write端的AutoCloseOutputStream和read端的AutoCloseInputStream,我们就可以实现进程见的数据流传输了。

完整的跨进程数据传输方案如下:
  1. 文件传输

    两端业务层都把Uri对应的ParcelFileDescriptor发送给通信层,发送端通信层从AutoCloseInputStream中取数据发送,接收端通信层获取到数据后,写入到AutoCloseOutputStream中。

  2. 流传输

发送端:
1. 业务层调用getOutputStream向通信层发起请求
2. 通信层通过creatPipe 建立一个ParcelFileDescriptor数组,并将write端的pipe[1]返回给业务层
3. 业务层得到pipe[1](ParcelFileDescriptor)后,可以通过AutoCloseOutputStream写入数据
4. 从通信层的pipe[0]的AutoCloseInputStream中读出数据通过socket发送出去

接收端:
1. 业务层调用getInputStream向通信层发起请求
2. 通信层通过creatPipe 建立一个ParcelFileDescriptor数组,并将read端的pipe[0]返回给业务层
3. 业务层得到pipe0后,可以通过AutoCloseInputStream读取数据。(如没有数据,则阻塞,一直等到有数据为止)
4. socket中读取数据,写入到通信层的pipe[1]的AutoCloseOutputStream。(pipe[1]一旦写入,第三步中pipe[2]就可以读取出数据)

简单的ParcelFileDescriptor使用——pipe

  1. public class DemoParcefliledescriptor extends AppCompatActivity {
  2. private static final String TAG = "DemoPFD";
  3. private static final String[] PERMISSIONS = {
  4. Manifest.permission.WRITE_EXTERNAL_STORAGE,
  5. };
  6. private static final int PERMISSIONS_CODE = 3006;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_demo_null);
  11. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  12. requestPermissions(PERMISSIONS, PERMISSIONS_CODE);
  13. }
  14. FileOutputStream outputStream = new FileOutputStream(getStreamFd());
  15. try {
  16. outputStream.write(99);
  17. outputStream.write(98);
  18. outputStream.close();
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. private FileDescriptor getStreamFd() {
  24. ParcelFileDescriptor[] pipes = null;
  25. try {
  26. pipes = ParcelFileDescriptor.createPipe();
  27. new TransferThread(new ParcelFileDescriptor.AutoCloseInputStream(pipes[0])).start();
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. }
  31. return pipes[1].getFileDescriptor();
  32. }
  33. static class TransferThread extends Thread {
  34. InputStream in;
  35. FileOutputStream out;
  36. TransferThread(InputStream in, FileOutputStream out) {
  37. this.in = in;
  38. this.out = out;
  39. }
  40. TransferThread(InputStream in) {
  41. this.in = in;
  42. File outFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/zlq_pdf");
  43. Log.i(TAG, "File: " + outFile.getAbsolutePath());
  44. try {
  45. out = new FileOutputStream(outFile);
  46. } catch (FileNotFoundException e) {
  47. e.printStackTrace();
  48. }
  49. }
  50. @Override
  51. public void run() {
  52. byte[] buf = new byte[1024*2];
  53. int len;
  54. try {
  55. while((len=in.read(buf)) > 0) {
  56. out.write(buf, 0, len);
  57. Log.i(TAG, "out:" + len);
  58. }
  59. in.close();
  60. out.flush();
  61. out.getFD().sync();
  62. out.close();
  63. } catch (IOException e) {
  64. e.printStackTrace();
  65. }
  66. }
  67. }
  68. }


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/426811
推荐阅读
相关标签
  

闽ICP备14008679号