码迷,mamicode.com
首页 > 其他好文 > 详细

认识进程与IPC架构

时间:2014-09-16 15:59:10      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:android   框架   

1、什么是IPC通信
  • IPC(Inter-Process Communication)通信,是跨越两个不同进程之间的通信
  • 一般而言,一个Android应用程序里的各个组件(如activity、service)都在同一个进程里执行。这种在同一进程内的通信,又称短程通信,意味着两个activity在同一个进程里执行。
  • 相对地:远程(Remote)通信的意思是:两个组件(activity或service)分别在不同的进程执行,两者之间的IPC通信又称远程通信。
默认情况下一个android程序运行在同一个进程中,但是可以通过预设将不同的组件运行在不同的进程中。

IPC通信的效率
  • 当我们启动某一应用程序时,Android系统里的Zygote服务孵化(Fork)一个新的进程给它,让后将它(该App)加载到这个新诞生的进程里。
  • 基于Linux的安全限制,以及进程的基本特性(不同进程的地址空间是独立的)。如果两个类(或其对象)在同一个进程里执行时,两者沟通方便也快速。
  • 但是,当他们分别在不同的进程里执行时,两者沟通就属于IPC跨进程沟通了(转地址),不如前者方便,也慢些。
2、Android的进程概念

  • 一个进程就是一个独立的执行空间,不回被正在其它进程里地程序所侵犯。这种保护方法是Android的重要安全机制。
  • 在Android的进程里,有一个虚拟机 (Virtual Machine,简称VM)的对象,可执行Java代码,也引导JNI本地程序的执行, 实现Java与C/C++之间的沟通;如下图:

        每一进程有:一个VM对象、主线程、 MQ和Looper

      bubuko.com,布布扣

  • 每一个进程在诞生时,都会诞生一个主线程(Main Thread),以及诞生一个Looper类 的对象和一个MQ(Message Queue)数据 结构。每当主线程作完事情,就会去执行 Looper类。此时,不断地观察MQ的动态。 如下图:
          不同进程的地址空间是独立的


  bubuko.com,布布扣

  • 主线程最主要的工作就是处理UI画面的事 件(Event),每当UI事件发生时,Android 框架会丢信息(Message)到MQ里。主线程 看到MQ有新的信息时,就取出信息,然后 依据信息内容而去执行特定的函数。执行 完毕,就再继续执行Looper类,不断地观 察MQ的动态。
  • 当两个类都在同一个进程里 执行时,两者之间的沟通,只要采取一般 的函数调用(Function Call)就行了,既快速 又方便。一旦两个类分别在不同的进程里 执行时,两者之间的沟通,就不能采取一 般的函数调用途径了,只好采取IPC沟通途径。
3、设定IPC通信-- 使用AndroidManifest.xml文件

  • 在Android框架里,一个应用(程序)套件 (Application Package)通常含有多个 Java类(Class),这些类可以在同一个进 程(Process)里执行;也可以在不同的进 程里执行 。
  • 通常,一个进程只会摆一个App。但是一个App可占用多个进程
  • 例如有一个App的AndroidManifest.xml 文件内容如下:
//........
     <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>
  依据此配置文件将各类部署于两个进程里执行


bubuko.com,布布扣

  • 其中,FirstActivity和LoadActivity两个类 别会加载预设的进程里。而LoadService则 会加载于名为“remote”的独立进程里。 并且,由进程#1的主线程去执行 FirstActivity和LoadActivity(的函数)。而由 进程#2的主线程去执行LoadService。
 4IPC的IBinder接口-- 定义与实现

  • Android框架的IPC沟通仰赖单一的IBinder 接口。此时Client端调用IBinder接口的 transact()函数,透过IPC机制而调用到远方 (Remote)的onTransact()函数。
  • 在Android的源代码里,Java层的IBinder 接口是定义于IBinder.java代码文档里。此 程序文件如下:
  // IBinder.java
     // .......
     public interface IBinder {
          // ..........
          public boolean transact(int code, Parcel data, Parcel reply, int flags)
               throws RemoteException; // ...........
     }

  • 基于这个IBinder.java定义档,我们就可以 开发类别来实现(Implement)它,然后提供 给其它App来调用了。在Android的框架里, 也撰写了Binder基类和BinderProxy类来实现IBinder接口。


认识进程与IPC架构

标签:android   框架   

原文地址:http://blog.csdn.net/namehybin/article/details/39317321

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!