讲解这个问题之前我们先来看看这个问题“为什么进程间不能直接进行通信,而需要借助Binder或者Socket通信”, 其实这个问题只要了解过虚拟机的同学大概都会明白怎么回事:
由于在安卓系统中一个进程对应一个虚拟机对象,而在Java虚拟机对象中只存在一个堆区和一个方法区,并且被所有线程共享,所以能够直接通信的只有在虚拟机内部堆区和方法区,进程间通信属于虚拟机对象间通信不能直接通信,当然大家还应该明白一个机器只有一个虚拟机创建多个虚拟机对象来实现多进程也就是多应用。至于栈区、堆区、方法区各自存储的是什么,这就需要同学们认真的去了解一下虚拟机,这里就不做过多详解了。
好了言归正传,再回来聊聊为什么Android进程间通信有时候用Binder有时候用Socket,其实这也是跟Java虚拟机有关的。安卓系统中进程间通信使用Socket通信的,system_server进程与zygote进程通信的时候用到了Socket,system_server进程通过LocalSocket连接zygote进程的serverSocket传递参数ActivityThread,通知zygote进程fork出Android应用进程执行ActivityThread的main()方法。由于zygote进程是所有Android应用进程的父进程,system_server进程也是由zygote进程fork出来的大儿子基于Dalvik VM虚拟机,而zygote进程是基于JVM虚拟机,所以他们system_server进程与zygote进程只能使用socket通信,Binder通信属于基于Dalvik VM虚拟机两个进程之间的通信方式。