android进程间通信机制讲解

来源:互联网 发布:阴茎折断 知乎 编辑:程序博客网 时间:2024/05/04 21:59

   这里主要讲解Android中的IPC——inter Process  communication,含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。

说起进程间通信,我们先来了解什么是进程,什么是线程?按照操作系统中的描述,线程是CPU调度的最小单元,同时是一种有限的系统资源。而进程一般指一个执行单元,在pc和移动端指一个进程或者一个应用。一个进程可以有多个线程,所以进程和线程是包含与被包含的关系。简单的来说,一个进程可以只有一个线程,在Android中称之为主线程,也叫UI线程,在UI线程才能操作界面。在通常情况下,一个进程需要执行大量的耗时任务,如果这些任务在主线程中执行,将会造成界面卡顿,无响应,在Android中称之为anr——Application not  responding 。解决这个问题把一些耗时操作放到线程中即可。

在Android中,最有特色的进程间通信就是binder,通过binder可以轻松的实现进程间通信。当然Android还支持socket,通过socket也可以实现任意两个终端之间的通信。

一般情况,通过给四大组件指定Android:process属性就可以轻松地开启多进程模式,看似简单,其实暗藏杀机,多进程远远没有我们想的那么简单,很多时候多进程带来代码层面的负面影响远远大于多进程所带来的好处。在Android中只有一种方法实现多进程城模式,就是在四大组件(activity、recever、service,contentprovider)在menifest中配置属性Android:process属性。也就是说我们不能给一个线程或者一个实体类指定器运行时所在的进程。其实还有一个非常规实现多进程的方法,就是通过jin在native层去fok一个新的进程,但这种方法是特殊情况,也不是常用的创建多进程的方式。下面的代码描述了如何在Android中创建一个多进程

<activity    android:name=".MainActivity"    android:configChanges="orientation|screenSize"    android:launchMode="standard">    <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />    </intent-filter></activity><activity    android:name=".ScendeActivity"    android:configChanges="screenLayout"    android:process=":remote"></activity><activity android:name=".ThrildActivity"    android:configChanges="screenLayout"    android:process="com.juling.ipcactivity.remote"/>

在eclipse上运行此程序之后,我们在ddms中发现末尾有三个进程,进程id分别为645,659和672,如下图所示:

                                                                            

大家注意,在secondactivity和thirdactivity 中的配置分别为“:remote”和“com.juling.ipcactivity.remote”他们两种方式是有区别的,其区别在于“:”是指在当前进程名前附加当前的包名,这一种缩写的方法。“:”开头的进程是当前进程的私有金进程,其他应用组件不可能和他跑在同一个进程中。而不以“:”开头的进程属于全局进程,可以通过shareuid和他跑在同一个进程中。他们必须是具有相同的shareuid并且具有相同的签名才可以。共享后他们看起来是一个应用的两个部分。

一般来说共享多进程会带来如下的问题:

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

2.线程同步机制完全失效;

3.sharedpreferences可靠性下降;

4.application会多次创建;

其中第一个、第二个问题是因为他们不存在同一个内存中,所以储存和同步锁所同步的是不同的对象和元素,第三个问题是因为sharedpreferences不支持两个进程同时进行读写操作,否则会导致一定几率的数据丢失。在sharedpreferences中,底层是通过读/写XML文件来实现的,并发性的操作显然是会出问题的。第四个问题是每次跑一个新的进程Android都会为他分配一个虚拟机,所以这个过程就是重启一个应用程序的过程。那么自然会创建一个新的application。

但是这些问题都需要解决,下一次来看第一种方法binder。







0 0
原创粉丝点击