ipc

来源:互联网 发布:网络借贷安全班会 编辑:程序博客网 时间:2024/06/02 17:15

在android中ipc机制有Binder和Socker。说到ipc的使用场景必须要提到多进程。那么为什么要用多进程呢?比如有些模块需要单独运行在一个进程中,又或者为了加大一个应用可使用的内存所以需要通过多进程来获取多份内存空间,还有就是当前应用需要向其他应用获取数据。

使用多进程
给四大组件在androidMenifest中指定android:process属性。有两种写法分别为“:remote“”com.yzj.chapter_2.remote”,这两个有什么区别呢?“:”开头的含义是要在当前的进程名前面附加上当前的包名,这是一种简写的方法,这种写法属于当前应用的私有进程,其他应用组件不可以和它跑在同一个进程中。另外一种是完整的写法,其他应用通过shareUID方式可以和它跑在同一个进程中。

使用多进程会造成如下几方面的问题:

  • 静态成员和单例模式完全失效
  • 线程同步机制完全失效
  • sharedPreferences的可靠性下降
  • Application会多次创建

android中的跨进程通信
使用intent来传递数据,共享文件和sharedPreferences,基于Binder的Messager和AIDL以及Socket等。

使用AIDL实现跨进程通信
实现aidl有两种方法:

  • 使用aidl文件让系统自动生成
  • 手动写实现对应功能的Binder

Android中的ipc方式

  1. 在intent中使用bundle传输数据。当启动另一个进程的Activity、Service、Receiver时,因为Bundle是实现了Parcellable接口的,所以可以通过intent携带bundle传递数据。
  2. 使用文件共享。说下这种方式的问题,那就是并发的问题。
  3. 使用Messenger。通过它可以在不同的进程中传递Message对象,在Message中放入我们需要传递的数据。其实Messenger是一种轻量级的ipc方案,它的底层实现是AIDL。缺点是:Messenger是以串行的方式处理发来的消息,如果有大量的消息,仍然只能一个一个处理。而且messenger只能传递消息,很多时候需要调用服务端方法messenger就无法做到了。
  4. 使用AIDL,为了方便AIDL开发,建议把所有和AIDL相关的类和文件全部放入同一个包中。其中自定义的Parcelable对象和AIDL对象必须要显式的import进来,不管它们是否和当前的AIDL文件位于同一个包内。另外一个需要注意的地方是:如果AIDL文件中用到了自定义的Parcelable对象,那么必须新建一个和它同名的AIDL文件,并在其中声明它为Parcelable类型。在里面添加Parcelable Bean;除此之外AIDL中除了基本数据类型,其他类型的参数必须标上方向:in、out或者inout,in表示输入型参数,out表示输出型参数,inout表示输入输出型参数。
  5. 使用ContentProvider,它的底层也是Binder。
  6. 使用Socket
0 0
原创粉丝点击