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一个新的进程
以第一种方法为例:
分析:
当前包名为“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文件来实现,并发读写有可能出现问题;这就解释了第四种问题出现的原因。
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文件来实现,并发读写有可能出现问题;这就解释了第四种问题出现的原因。
相关文章推荐
- Android init进程中的 charger mode 模式
- Android init进程中鲜为人知的charger mode 模式
- Android中的多进程模式
- 【Android开发艺术探索读书笔记】第二章 Android中的多进程模式
- Android中的多进程模式
- Android应用程序模块详解(任务、启动模式、进程和线程、FLAG_ACTIVITY_NEW_TASK)
- Android IPC -- 初期(实现多进程模式)
- Android四大组件——Activity生命周期、启动模式、显隐式意图、杀死进程、杀死所有Activity、安装及反编译
- android中的多进程模式
- 《Android开发艺术探索》读书笔记----第二章:Android IPC 简介、多进程模式
- Android内核模式下对当前进程的cred结构的获取方式
- 【安卓笔记】成长第三步,Android IPC简介与Android中的多进程模式
- Android IPC:(一)多进程模式
- android 中的多进程模式
- Android中的多进程模式
- Android init进程中鲜为人知的charger mode 模式 .
- IPC机制---02 Android中的多进程模式
- 【Android 学习】IPC机制(一)Android IPC简介及多进程模式
- Android init进程中鲜为人知的charger mode 模式
- Android IPC机制—跨进程的观察者模式