Android的IPC机制

一、Android IPC简介

        IPC(Inter-Process Communication)含义为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程。说到进程,首先区分下进程与线程。按照操作系统来说,线程是指CPU调度的最小单元,因此线程是一种有限的系统资源;而进程一般指一个执行单元,在PC和移动设备上指一个程序或者一个应用。一个进程可以包含多个线程。

        任何操作系统都需要有相应的IPC机制,在Android中最具特色的进程间通信方法就是Binder了,通过Binder可以轻松地实现进程间通信。

          要使用到IPC机制显然就是在多进程的场景下,多进程的情况主要分为两种:第一种情况就是应用程序因为某些原因需要采用多进程模式实现,比如有些模块需要再单独的进程中运行,或者程序为了加大自己能使用的内存资源使用多进程;第二种情况就是当前应用需要从其他应用获取数据,由于是两个应用所以必须使用跨进程通信方式来获取数据,比如系统提供的ContentProvider查询数据时,也是一种跨进程通信,只不过通信细节被系统屏蔽,对我们透明了。


二、Android中的多进程模式

          严格来讲,在Android中使用多进程只有一种方法,那就是在AndroidManifest文件中给四大组件指定android:process属性,属性值不同就代表一个新的进程。虽然开启多进程的方法比较简单,但是开启后容易造成很多问题,下面结合多进程模式的运行机制来介绍这些问题。

          由于,Android会给每个应用分配一个独立的虚拟机,也就是为每个单独的进程分配一个单独的虚拟机,而Android会给不同的虚拟机分配不同地址空间的内存,这也就导致了在不同虚拟机中访问同一个类的对象会分别产生多个副本。因此,所有运行在不同进程中的四大组件,只要他们需要通过内存来共享数据,都是行不通的,也就是多进程模式带来的主要影响。正常情况下,四大组件之间不可能不通过某些中间层来共享数据,此时,通过简单的指定进程名来开启多进程都会行不通。

          一般来说,使用多进程模式会造成如下几方面的问题:

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

                由于静态成员要求在所有地方都能共享,因此需要为它分配一块单独的唯一的内存空间,这在多进程模式下显然是做不到的。同理,单例模式也是需要单独分配一个内存空间存放组件并统一管理,这也是多进程模式下做不到的。

           2)线程同步机制完全失效

                类似于第一个问题,由于不同进程分配的不是同一块内存,那么不管是锁对象还是锁全局类都无法保证线程同步,因为不同进程锁的不是同一个对象。

           3)SharedPreference的可靠性降低

                由于SharedPreference不支持多进程同时执行写操作,否则会造成一定几率的数据丢失。

           4)Application会多次创建

                当一个Application中有属于不同进程的组件时,这些组件分别属于不同的虚拟机和Application。


三、IPC基本概念

          为了避免上述问题,Android提供了一系列的解决办法,在介绍具体的IPC方式前,需要了解一下IPC中的几个基本概念。

          首先,为了防止对象在不同进程中不能公用,必须找到一种可以将对象在不同进程间传输的方法。这里就要用到JAVA中的序列化的方法了,序列化是指,将对象的状态信息转化为可以存储或传输的形式的过程。Android中为我们提供了两种接口来完成对象的序列化过程:Serializable和Parcelable接口。

          而最为重要的还是Binder机制,但Binder的机制太过复杂,这里暂时从其应用层来介绍,并记录在Activity和Service之间进行通信时的用法(虽然此时并没有用到Binder在IPC中的功能...)。从应用层来说,Binder是客户端和服务端进行通信的媒介,当bindService时,系统会调用服务器端Service中的onBind方法,并从中返回一个包含了服务端业务调用的Binder对象,通过这个Binder对象,客户端就可以获取服务端提供的服务或数据。具体地说,也就是在Service类中新建一个继承自Binder的内部类,在此内部类中添加各种方法已完成服务器端需要提供的服务或数据,接着在Activity中得到Service类中的Binder对象,用此对象的成员方法来完成各种服务,即实现了服务器端到客户端的联系。

           Binder在跨进程通信中的用法和原理后续补充.......


四、Android中的IPC方式

           Android提供的IPC方法有多种,比如通过Intent中附加extras来传递信息、通过共享文件的方式来共享数据、采用Binder方式来跨进程通信、四大组件之一的ContentProvider就是为了支持跨进程访问的以及Socket也可以实现IPC。

           Binder方式涉及到AIDL,较为复杂,这里暂不介绍......

           1)使用Bundle

            Bundle是一个实现了Parcelable接口的类,它是用来以键值对形式存放数据的,可以用来在不同进程间传输。而四大组件中的Activity、Service、Receiver都是支持在Intent中传递Bundle数据的。因此,在一个进程中启动另一个进程的Activity、Service、Receiver时,我们可以在Bundle中附加我们需要传输给远程进程的数据并通过Intent发送出去。但需要注意的是,这些数据必须支持序列化。

            2)使用共享文件

            由于Android系统是基于Linux的,因此其可以进行并发地读/写文件,这样就完成了两个进程间的通信。

            3)使用ContentProvider

            这里仅稍微介绍ContentResolver的基本用法,也即使用现有的ContentProvider来读取和操作相应程序中的数据。在每个应用程序中想要访问ContentProvider中的数据,就要通过context的getContentResolver()方法获得ContentResolver实例,然后通过其实例调用其增删改查的各方法。其中insert()用于添加数据,update()用于更新数据,delete()用于删除数据,query()用查询数据。但需要与SQLiteDatabase中增删改查方法相区别的是,ContentResolver的个方法介绍的是Uri参数,而不是表名参数。


后续添加。。。。。

           


           

            

你可能感兴趣的:(Android,Java)