Android的IPC机制--学习笔记

作者: Kevin_Curry | 来源:发表于2016-03-23 11:13 被阅读218次

    IPC :进程通信或者跨进程通信;两个进程间进行数据交换的过程;

    什么是线程,什么是进程;

    线程是CPU调度的最小单元;是一种有限的系统资源;而进程是一个执行单元,在移动设备或PC上指一个应用或程序一个进程可以包含一个或多个线程;

    使用多进程容易造成以下几个问题:

    1.静态成员和单例模式完全失效;

    2.线程同步机制完全失效:无论锁对象还是锁全局对象都无法保证线程同步;

    3.SharedPreferences的可靠性下降:SharedPreferences不支持并发读写;

    4.Application会多次创建:当一个组件跑在一个新的进程的时候,系统要在创建新的进程的同时分配独立的虚拟机,应用会重新启动一次,也就会创建新的   Application。运行在同一个进程中的组件是属于同一个虚拟机和同一个Application。同一个应用的不同组件,如果它们运行在不同进程中,那么和它们分别属于两个应用没有本质区别。

    IPC通讯方式

    (1)使用Bundle:Bundle实现了Parcelable接口,Activity、Service和Receiver都支持在Intent中传递Bundle数据。

    (2)使用文件共享:这种方式简单,适合在对数据同步要求不高的进程之间进行通信,并且要妥善处理并发读写的问题。SharedPreferences是一个特例,虽然它也是文件的一种,但是由于系统对它的读写有一定的缓存策略,即在内存中会有一份SharedPreferences文件的缓存,因此在多进程模式下,系统对它的读写就变得不可靠,当面对高并发读写访问的时候,有很大几率会丢失数据,因此,不建议在进程间通信中使用SharedPreferences。

    (3)使用Messenger:Messenger是一种轻量级的IPC方案,它的底层实现就是AIDL。Messenger是以串行的方式处理请求的,即服务端只能一个个处理,不存在并发执行的情形,详细的示例见原书。

    (4)使用AIDL

    大致流程:首先建一个Service和一个AIDL接口,接着创建一个类继承自AIDL接口中的Stub类并实现Stub类中的抽象方法,在Service的onBind方法中返回这个类的对象,然后客户端就可以绑定服务端Service,建立连接后就可以访问远程服务端的方法了。

    1.AIDL支持的数据类型:基本数据类型、String和CharSequence、ArrayList、HashMap、Parcelable以及AIDL;

    2.某些类即使和AIDL文件在同一个包中也要显式import进来;

    3.AIDL中除了基本数据类,其他类型的参数都要标上方向:in、out或者inout;

    4.AIDL接口中支持方法,不支持声明静态变量;

    5.为了方便AIDL的开发,建议把所有和AIDL相关的类和文件全部放入同一个包中,这样做的好处是,当客户端是另一个应用的时候,可以直接把整个包复制到客户端工程中。

    6.RemoteCallbackList是系统专门提供的用于删除跨进程Listener的接口。RemoteCallbackList是一个泛型,支持管理任意的AIDL接口,因为所有的AIDL接口都继承自IInterface接口。

    (5)使用ContentProvider

    1.ContentProvider主要以表格的形式来组织数据,并且可以包含多个表;

    2.ContentProvider还支持文件数据,比如图片、视频等,系统提供的MediaStore就是文件类型的ContentProvider;

    3.ContentProvider对底层的数据存储方式没有任何要求,可以是SQLite、文件,甚至是内存中的一个对象都行;

    4.要观察ContentProvider中的数据变化情况,可以通过ContentResolver的registerContentObserver方法来注册观察者;

    (6)使用Socket

    Socket是网络通信中“套接字”的概念,分为流式套接字和用户数据包套接字两种,分别对应网络的传输控制层的TCP和UDP协议。

    相关文章

      网友评论

        本文标题:Android的IPC机制--学习笔记

        本文链接:https://www.haomeiwen.com/subject/hhgtlttx.html