• Android架构师之路-进程和IPC架构(1)


    1.IPC通信

    2.android进程概念

    3.设置IPC通信

    4.IPC接口-定义和实现

    5.IBinder接口的使用

    6.IPC通信三步骤

    7.短程通信和远程通信


    1.先来看第一个大问题,什么是ipc通信?

             IPC(Inter-Process Communication)通信是跨越两个不同进程(process)的通信。

             一般而言,一个android应用程序里面的各组件(activity,service)都在一个进程里面执行,这种通信叫做短程通信,这就意味着两个activity在同一个进程里面执行。

             相对来讲的是远程通信:两个组件(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++程序之间的沟通



  • 相关阅读:
    关于ThreadLocal
    二月份推荐的书籍
    《编写高质量代码:改善Java程序的151个建议》笔记
    Oracle中定义package以及存储过程的使用
    不同系统平台下Java默认的安装路径
    WebSphere数据源配置
    Dedication(转)
    Upgrading to Java 8——第二章 Method References(方法引用)
    Upgrading to Java 8——第一章 Lambda表达式
    Multi-catch
  • 原文地址:https://www.cnblogs.com/dandre/p/4507003.html
Copyright © 2020-2023  润新知