IPC机制(三)

Android中的IPC方式

       比如,可以通过在Intent中附加extras来传递信息,或者通过共享文件的方式来共享数据,还可以采用Binder方式来跨进程通信,另外,ContentProvider天生就是支持跨进程访问的,因此我们也可以采用它来进行IPC。此外,通过网络通信也是可以实现数据传递的,所以Socket也可以实现IPC。

一、使用Bundle

       四大组件中的三大组件(Activity、Service、Receiver)都是支持在Intent中传递Bundle数据的,由于Bundle实现了Parcelable接口,所以它可以方便地在不同的进程间传输。

二、使用文件共享

       文件共享也是一种不错的进程间通信的方式,两个进程通过读/写同一个文件来交换数据,比如A进程把数据写入文件,B进程通过读取文件来获取这个数据。注意,反序列化得到的对象只是在内容上和序列化之前的对象是一样的,但它们本质上还是两个对象。

       通过文件共享方式来共享数据对文件格式是没有具体要求的,比如可以是文本文件,也可以是XML文件,只要读/写双方约定数据格式即可。通过文件共享的方式也是有局限性的,比如并发读/写的问题。我们要尽量避免并发写这种情况的发生或者考虑使用线程同步来限制多个线程的写操作。通过上面的分析,我们可以知道,文件共享方式适合在对数据同步要求不高的的进程间进行通信,并且要妥善处理并发读/写问题。

       当然,SharedPreference是个特例,它是Android中提供的轻量级存储方案,它通过键值对的方式来存储数据,在底层实现上它采用XML文件来存储键值对,每个应用的SharedPreference文件都可以在当前包所在的data目录下查看到。一般它的目录位于/data/data/package name/shared_pref目录下,其中package name 表示的是当前应用的包名。从本质上来说,SharedPreference也是属于文件的一种,但是由于系统对它的读/写有一定缓存策略,即在内存中会有一份SharedPreference文件的缓存,因此在不多进程模式下,系统对它的的读写就变得不可靠,当面对高并发的读/写访问,SharedPreference有很大的概率会丢失数据,因此,不建议在进程间通信中使用SharedPreference。

三、使用Messenger

       Messenger可以翻译为信使,顾名思义,可以通过它在不同进程中传递Message对象,在Message中放入我们需要传递的数据,就可以轻松地实现数据的进程间传递了。Messenger是一种轻量级的IPC方案,它的底层实现是AIDL。从构造方法可以看出:

       //Service使用

        public Messenger(Handler target){

             mTarget = target.getIMessenger();   

        }

       //Client端使用

        public Messenger(IBinder targer){

          mTarget = IMessenger.Stub.asInterface(target);

        }

使用(Service与Client互相发送信息)

1.Service端创建Messenger

服务端

2.注册Service ,让其运行在单独的进程中

清单文件

3.Client端接收Messenger发送信息给Service端

客户端

运行结果如下:

4.实现服务器向客户端发送信息的双向交流

客户端
服务端
客户端收到的结果
Messenger的工作原理


参考链接:

Android 开发艺术探索

https://www.cnblogs.com/rookiechen/category/806330.html

你可能感兴趣的:(IPC机制(三))