1.IPC通讯html
2.android进程概念android
3.设置IPC通讯安全
4.IPC接口-定义和实现数据结构
5.IBinder接口的使用app
6.IPC通讯三步骤框架
7.短程通讯和远程通讯函数
1.先来看第一个大问题,什么是ipc通讯?oop
IPC(Inter-Process Communication)通讯是跨越两个不一样进程(process)的通讯。线程
通常而言,一个android应用程序里面的各组件(activity,service)都在一个进程里面执行,这种通讯叫作短程通讯,这就意味着两个activity在同一个进程里面执行。code
相对来说的是远程通讯:两个组件(activity和service)分别在不一样的进程里面执行,二者想要通讯,必须经过IPC通讯,这就是所谓的远程通讯。
IPC通讯效率:
启动app,android系统里的Zygote服务孵化一个新的进程给app,而后将app加载到新诞生的进程中。
基于Linux的安全限制,以及进程的基本特性,不一样的进程的地址空间是独立的,若是两个类在同一个进程执行,二者的沟通方便也快速
不一样进程内执行时,须要借助IPC跨进程通讯了。
2.android的进程概念
一个进程是一个独立的执行空间,不会被正在其它进程里的程序所侵犯。这种保护方法是Android的重要安全机制。因而,得先认识进程的内涵,才能进一步了解跨进程IPC机制。
•在Android的进程里,有一个虚拟机(Virtual Machine,简称VM)的对象,可执行Java代码,也引导JNI本地程序的执行,实现Java与C/C++之间的沟通
每个进程在诞生时,都会诞生一个主线程(Main Thread),以及诞生一个Looper类的对象和一个MQ(Message Queue)数据结构。每当主线程做完事情,就会去执行Looper类。
主线程最主要的工做就是处理UI画面的事件(Event),每当UI事件发生时,Android框架会丢信息(Message)到MQ里。主线程看到MQ有新的信息时,就取出信息,而后依据信息内容而去执行特定的函数。执行完毕,就再继续执行Looper类,不断地观察MQ的动态。
刚才说明了,当两个类都在同一个进程里执行时,二者之间的沟通,只要采起通常的函数调用(Function Call)就好了,既快速又方便。一旦两个类分别在不一样的进程里执行时,二者之间的沟通,就不能采起通常的函数调用途径了,只好采起IPC沟通途径。
3.设置IPC通讯
在Android框架里,一个应用(程序)套件(Application Package)一般
</pre>含有多个Java类(Class),这些类能够在同一个进程(Process)里执行;也能够在不一样的进程里执行 。•一般,一个进程只会摆一支App。可是一支App可占用多个进程。<p></p><p></p><pre code_snippet_id="636160" snippet_file_name="blog_20150404_2_1842967" name="code" class="html"><activity android:name=".FirstActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name ="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".LoadActivity"> </activity> <service android:name=".LoadService" android:process=":remote" > <intent-filter> <action android:name ="com.misoo.pkm.REMOTE_SERVICE" /> </intent-filter></service> </manifest>
android:process=":remote",经过设置这个属性,将该service设置为单独一个进程中,与其余的activity或者service隔离开来,这样之,一个app中就会有两个进程了
其中,FirstActivity和LoadActivity两个类别会加载预设的进程里。而LoadService则会加载于名为“remote”的独立进程里。
这样,蓝色竖线两边分别是两个独立的进程,各自运行这本身的程序,为了数据的安全起见,每一个进程都须要独立建立一个vm对象,独享本身的数据,防止进程间数据共享,致使数据恶意篡改,不利于程序安全。
在Android的各进程里,都有一个VM对象,执行Java代码,也引导JNI本地程序的执行,实现Java与C/C++程序之间的沟通