您的位置:首页 > 移动开发 > Android开发

Android多进程模式

2016-08-11 17:59 169 查看
一、IPC简介

IPC(Inter-Process Communication),含义为进程间通信,也就是指两个进程之间进行数据交换的过程。

线程与进程的概念:

线程:CPU调度的最小单元

进程:一般指一个执行单元

一个进程可以包含多个线程;最简单的情况下,一个进程中可以只有一个线程,即主线程,在Android里面主线程也叫UI线程,在UI线程里才能操作界面元素。需要注意的是UI线程中不能执行耗时任务,否则会引起ANR,即应用无响应;解决这个问题就需要把耗时任务放到非UI线程中执行。

二、开启多进程模式

这里的多进程模式讨论的是一个应用存在多个进程的情况;

应用开启多进程模式有两种方法:

第一种:只需在AndroidMenifest文件中为四大组件指定android:process属性

第二种:通过JNI在native层去fork一个新的进程

以第一种方法为例:

<activity
android:name="com.ryg.chapter_2.MainActivity"
android:configChanges="orientation|screenSize"
android:label="@string/app_name"
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=".SecondActivity"
android:configChanges="screenLayout"
android:label="@string/app_name"
android:process=":remote" />
<activity
android:name=".ThirdActivity"
android:configChanges="screenLayout"
android:label="@string/app_name"
android:process="com.ryg.chapter_2.remote" />


分析:

当前包名为“com.ryg.chapter_2”;

当SecondActivity启动时,会创建进程名为“com.ryg.chapter_2:remote”的进程;

当ThirdActivity启动时,会创建进程名为”com.ryg.chapter_2.remote“的进程;

同时入口MainActivity,没有为它指定process属性,则会运行在默认进程中,默认进程名为包名。

SecondActivity与ThirdActivity的进程名命名方式不同:前者是简写的命名方式,”:“的含义是指当前进程名前面附加上当前的包名;后者是完整的命名方式,不会附加包名信息。

注意:进程名以”:“开头的进程属于当前应用的私有进程;而进程名不以”:“开头的进程属于全局进程,也就是说其他应用可以通过ShareUID的方式与全局进程进行共享数据,比如相互访问对方的私有数据(data目录、组件信息等),还要注意的是签名必须相同。

开启多进程模式很简单,但是它会造成如下问题:

1、静态成员和单例模式失效

2、Application会多次创建

3、线程同步机制完全失效
(这里指的是多进程间的线程同步)

4、SharedPreferences的可靠性下降

Android为每一个进程分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,也就导致了同一类对象会有多份副本,所以运行在不同进程间的四大组件不能通过内存来共享数据;这就解释了第一种问题出现的原因。

当一个组件在一个新的进程中启动的时候,由于系统要新的进程,并为其分配独立的虚拟机,这个过程其实就是启动一个应用的过程,那么自然会重新创建新的Application;这就解释了第二种问题出现的原因。

不同的进程有不同的内存地址,那么不管是锁对象还是锁全局类都无法保证线程同步,因为不同进程锁的不是同一个对象;这就解释了第三种问题出现的原因。

SharedPreferences是通过读写XML文件来实现,并发读写有可能出现问题;这就解释了第四种问题出现的原因。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息