美文网首页
日更挑战-安卓开发之Binder

日更挑战-安卓开发之Binder

作者: 愿你我皆是黑马 | 来源:发表于2021-06-19 22:46 被阅读0次

越不懂的越爱装
大家都同等:IT世界没有难不难,只有是否了解过

挑战目录

什么是Binder

是一种进程间通信机制。
安卓中每个进程对应一个JVM虚拟机。进程内部存在JVM虚拟机的数据结构(堆、方法区、线程私有区域等)。
进程之间通过内核空间进行交互。


Client和Server

都是JVM虚拟机对应的进程,相当于一个个的安卓应用程序。安卓应用程序间通过IPC进行通信。


AIDL

  • AIDL的实现。
    1. 编写aidl文件
      新建一个包名,在新建的包名内创建aidl文件。

      ### TestAIDL.aidl
      interface TestAIDL {
          int add(int a,int b);
          int jian(int a,int b);
      }
      
    2. 点击build编译aidl文件,在build的gen、aidl目录下生成对应java文件


      image.png
      • 接口TestAIDL:对应.aidl文件生成的java文件

      • class Default:add和jian方法的默认实现 (一般直接返回0或null这样的值来实现)

      • 静态抽象子类Stub:

        1. 使用抽象类的方式抽象实现接口TestAIDL的两个方法add和jian

        2. 实现onTransact方法接收Bindle驱动发出的消息
          参数:code、data、replay、flags
          code:用于内部switch方法判断执行那个接口方法

          data:客户端传递过来的参数

          replay:服务器返回回去的值

          flags:标明是否有返回值,0有(双向)、1没有(单向)

        3. onTransact方法中switch语句具体对应接口方法处理

image.png

什么是进程间通信

  • 当进程需要向外提供或获取数据时(这里指JVM虚拟机中保存的数据)的一种方式。

  • 进程之间是无法进行通信的(存在进程隔离),每个进程都会通过系统调用和内核空间进行交互

  • 系统调用:
    系统调用主要通过如下两个函数来实现:

    copy_from_user() //将数据从进程空间拷贝到内核空间
    copy_to_user() //将数据从内核空间拷贝到进程空间
    
  • 当进程通过系统调用和内核空间交互时,进程的状态变为内核态:处理器处于特权级最高的(0级)

  • 安卓中:为了防止程序恶意读取数据,为每个APP分配UID,
    进程间通信有:

  1. 管道/匿名管道(pipe)
  • 管道是半双工的,数据只能向一个方向流动
  • 需要双方通信时,需要建立起两个管道
  • 只能用于父子进程或者兄弟进程之间
  • 队列结构:写的内容被管道另一端的进程读出
  1. 信号
  • 可以在任何时候发给某一进程,而无需知道该进程的状态
  1. 信号量
  2. 消息队列
  3. 共享内存
  4. 套接字
  5. 安卓中的Binder

安卓中的进程通信举例

  • 四大组件通信(可能是在同一个进程,也可能是在不同进程)
  • ActivityManagerService、PackageManagerService 等

相关文章

网友评论

      本文标题:日更挑战-安卓开发之Binder

      本文链接:https://www.haomeiwen.com/subject/qpamjltx.html