进程间内存相互隔离的。 在实际的开发过程中,可能需要把某些组件放在单独进程中去运行。
工作中你使用过多进程模式么?最常见的多进程模式是开启推送服务进程。
- 开启多进程模式
Android中的多进程模式,通过在配置清单中给四大组件设置android:process属性值,这样我们就可以轻易开启多进程模式。
这种方式开启的多进程指的是一个应用中存在多个进程的情况,进程间可共享私有数据(如data目录、组件信息等),但不能共享内存。
不同应用之间的多进程模式,进程之间不能共享私有数据,也不能共享内存。
另一种非常规的多进程方法,通过JNI在native层去fork一个新的进程,但是这种方法属于特殊情况,也不是常用的创建多进程的方式,因此我们不考虑这种方式(其实我不会)。
我们无法给一个线程或实体类指定其运行时所在的进程。
下面我们来看一下示例:
<activity
android:name=".main.TestActivity"
android:process=":test_activity"/>
<activity
android:name=".TestService"
android:process=":test_service"/>
<activity
android:name=".TestContentProvider"
android:process=":test_content_provider"/>
<activity
android:name=".TestBroadReceiver"
android:process=":test_broad_receiver"/>
当启动TestActivity时,系统会为它创建一个单独的进程,进程名为"包名:test_activity"。默认进程名是包名。
查看进程shell命令
adb shell ps | gres 包名 ##可查看到一个包名的所有进程
adb shell ps ##查看系统中的所有进程
应用的私有进程,以":"开始命名的进程属于应用的私有进程。其他应用组件不可以和它跑在同一个进程中。
全局进程,不以":"开始命名的进程属于全局进程,其他应用的组件通过ShareUID方式可以和它跑在同一个进程中。
无论私有进程还是全局进程,系统都会为其创建一个虚拟机来运行进程。Android为每一个应用分配了一个独立的虚拟机,或者说为每个进程都分配了一个独立的虚拟机,不同的虚拟机在分配上有不同的内存空间。
多进程的优势:
1 不被轻易kill掉,如推送服务在自己的进程中运行,按返回键退出程序,推送服务还后台的自己进程中运行。
2 系统分配给一个进程的内存大小是固定的,如果你的程序特别消耗内存,那么就开启多进程模式来增加内存。
3 把程序中的某些组件放在单独进程中运行。
一般来说,使用多进程会造成如下方面问题:
1 静态成员和单利模式完全失效。
2 线程同步机制完全失效。
3 SharedPreferences的可靠性下降。//SharedPreferences不支持多个进程同时读/写操作
4 Application会多次创建。