BpBinder与PPBinder调用过程——Android开发Binder IPC通信技术

news/2024/7/6 4:45:26

在Android系统中,进程间通信(IPC)是一个非常重要的话题。Android系统通过Binder IPC机制实现进程间通信,而Binder IPC通信技术则是Android系统中最为重要的进程间通信技术之一。本文将介绍Binder IPC通信技术的原理,并详细解析BpBinder与PPBinder调用过程的使用以及注意事项。

一、Binder IPC通信技术原理:

Binder IPC通信技术是Android系统中的一种高效的跨进程通信技术,它通过Binder驱动提供的底层机制来实现进程间的通信。Binder IPC通信技术的原理如下:

  1. Binder驱动: Binder驱动是Binder IPC通信技术的核心,它是一个位于内核空间的模块,负责处理进程间的通信请求。Binder驱动提供了一组系统调用接口,用于创建、注册、查找和销毁Binder对象,以及处理进程间的通信请求。
  2. Binder对象: 在Binder IPC通信技术中,进程间通信的基本单位是Binder对象。每个Binder对象都有一个唯一的标识符,称为Binder引用。Binder对象可以是服务端的Binder对象,也可以是客户端的Binder对象。服务端的Binder对象负责提供某种服务,而客户端的Binder对象则负责调用服务端提供的服务。
  3. Binder通信机制: 在Binder IPC通信技术中,通信的过程可以简单描述为以下几个步骤: (1)服务端创建Binder对象,并将其注册到Binder驱动中。 (2)客户端通过Binder引用找到服务端的Binder对象。 (3)客户端通过服务端的Binder对象调用相应的服务。 (4)服务端接收到客户端的调用请求,并处理请求。 (5)服务端将处理结果返回给客户端。

二、BpBinder与PPBinder调用过程:

BpBinder和PPBinder是Binder IPC通信技术中的两个重要的概念。BpBinder是客户端的Binder代理对象,用于向服务端发送调用请求;PPBinder是服务端的Binder代理对象,用于接收客户端的调用请求并处理。

  1. BpBinder调用过程: (1)客户端通过Binder引用找到服务端的Binder对象。 (2)客户端通过BpBinder的代理方法向服务端发送调用请求。 (3)BpBinder将调用请求封装成一个Parcel对象,并通过Binder驱动将Parcel对象发送给服务端。 (4)服务端的PPBinder接收到Parcel对象后,将其解析成调用请求,并调用相应的服务。 (5)服务端将处理结果封装成Parcel对象,并通过Binder驱动将Parcel对象发送给客户端。 (6)BpBinder接收到Parcel对象后,将其解析成处理结果,并返回给客户端。
  2. PPBinder调用过程:

(1)服务端创建一个继承自Binder类的子类,并重写其onTransact()方法。在该方法中,服务端根据接收到的调用请求进行相应的处理,并将处理结果封装成Parcel对象返回给客户端。 (2)服务端将创建的Binder对象注册到Binder驱动中,以便客户端能够通过Binder引用找到该Binder对象。 (3)客户端通过Binder引用找到服务端的Binder对象。 (4)客户端通过BpBinder的代理方法向服务端发送调用请求。 (5)BpBinder将调用请求封装成一个Parcel对象,并通过Binder驱动将Parcel对象发送给服务端。 (6)服务端的PPBinder接收到Parcel对象后,将其解析成调用请求,并调用相应的服务。 (7)服务端将处理结果封装成Parcel对象,并通过Binder驱动将Parcel对象发送给客户端。 (8)BpBinder接收到Parcel对象后,将其解析成处理结果,并返回给客户端。

三、BpBinder与PPBinder实战解析

在使用BpBinder与PPBinder进行调用过程时,需要注意以下几点:

  1. 使用BpBinder与PPBinder进行调用过程时,需要保证服务端的Binder对象已经注册到Binder驱动中,并且客户端能够通过Binder引用找到该Binder对象。
  2. BpBinder是客户端的Binder代理对象,可以通过其代理方法向服务端发送调用请求。在使用BpBinder进行调用时,需要注意传递的参数类型和顺序与服务端的方法定义保持一致。
  3. PPBinder是服务端的Binder代理对象,用于接收客户端的调用请求并处理。在使用PPBinder进行调用时,需要重写onTransact()方法,并根据接收到的调用请求进行相应的处理。
  4. 在调用过程中,BpBinder将调用请求封装成Parcel对象,并通过Binder驱动将Parcel对象发送给服务端。而PPBinder接收到Parcel对象后,将其解析成调用请求,并调用相应的服务。因此,需要确保调用请求和处理结果都能够正确地封装成Parcel对象,并且Parcel对象能够正确地在客户端和服务端之间进行传输。
  5. 在BpBinder与PPBinder调用过程中,需要注意处理异常情况。例如,当服务端无法处理客户端的调用请求时,需要抛出相应的异常并返回给客户端。

示例代码如下:

服务端代码:

public class MyService extends Service {
    private final Binder mBinder = new MyBinder();
​
    private class MyBinder extends Binder {
        @Override
        protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
            switch (code) {
                case 1: // 调用请求的标识符                    int arg1 = data.readInt(); // 解析调用请求的参数                    int result = processRequest(arg1); // 处理调用请求                    reply.writeInt(result); // 将处理结果封装成Parcel对象返回给客户端                    return true;
                default:
                    return super.onTransact(code, data, reply, flags);
      }
    }
  }private int processRequest(int arg1) {
    // 处理调用请求的逻辑 return arg1 * 2;
  }@Nullable
  @Override
  public IBinder onBind(Intent intent) {
    return mBinder;
  }
}
​
客户端代码:
```javapublic class MyClientActivity extends Activity {
    private IService mService;
​
    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            mService = IService.Stub.asInterface(iBinder);
        }
​
        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            mService = null;
        }
    };
​
    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
​
        Intent intent = new Intent(this, MyService.class);
        bindService(intent, mConnection, BIND_AUTO_CREATE);
​
        // 调用服务端的方法
        try {
            int result = mService.processRequest(10);
            Log.d(TAG, "Result: " + result);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
​
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(mConnection);
    }
}

本文主要解析在Android开发的Binder IPC通信中的重要技术点,BpBinder与PPBinder调用过程解析,更多有关Android开发技术,深入了解Binder技术可以参考《Binder手册》点击可查看详细类目。

注意事项:

  1. 在服务端的MyBinder类中,需要重写onTransact()方法,并根据接收到的调用请求进行相应的处理。在示例代码中,我们通过code参数来判断调用请求的标识符,然后解析调用请求的参数,并调用processRequest()方法处理请求。
  2. 在客户端的ServiceConnection中,我们通过asInterface()方法将IBinder对象转换为IService对象,以便我们可以调用服务端的方法。
  3. 在客户端的onCreate()方法中,我们先绑定服务端的Service,然后通过mService对象调用服务端的processRequest()方法,并打印处理结果。

总结:

本文介绍了Binder IPC通信技术的原理,并详细解析了BpBinder与PPBinder调用过程的使用和注意事项。通过使用BpBinder和PPBinder,我们可以实现跨进程通信,并且可以方便地调用服务端的方法。在使用过程中,需要注意注册Binder对象、传递参数、处理异常等细节。Binder IPC通信技术是Android系统中非常重要的进程间通信技术,对于实现跨进程通信和提高系统性能具有重要意义。


http://www.niftyadmin.cn/n/4924351.html

相关文章

龙蜥开发者说:是挑战也是契机!我见证了国产操作系统的雄起 | 第 22 期

「龙蜥开发者说」第 22 期来了!开发者与开源社区相辅相成,相互成就,这些个人在龙蜥社区的使用心得、实践总结和技术成长经历都是宝贵的,我们希望在这里让更多人看见技术的力量。本期故事,我们邀请了龙蜥社区开发者肖微…

Adb发送特定广播给App和App获取权限的命令

最近在做Autostart,但是没有bench R1环境 目前在模拟器上调试,需要调试自定义的广播和获取悬浮窗权限(因为这个app需要在开机未启动app的情况启动服务区获取传感器信号然后全局弹窗)。 需要先adb root adb remount 1.发送广播给…

CVPR 2023 | 无监督深度概率方法在部分点云配准中的应用

注1:本文系“计算机视觉/三维重建论文速递”系列之一,致力于简洁清晰完整地介绍、解读计算机视觉,特别是三维重建领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, NeurIPS, ICLR, ICML, TPAMI, IJCV 等)。本次介绍的论文是:2023年,CVPR,…

linux下.run安装脚本制作

1、安装文件(install.sh) PS: .run安装包内部执行脚本文件 2、资源文件(test.zip) PS: 待安装程序源文件 3、制作.run脚本(install.run) cat install.sh test.zip > install.run chmod ax install.run

php使用get和post传递数据出现414 Request-URI Too Large的解决方案

递数据出现414 Request-URI Too Large的解决方案 一、Request-URI Too Large的原因二、GET与POST三、项目分析1.读取源数据2.将读取的到数据,进行传递3.ajax获取传递的数据并传递到后台4.传递数据5.解决方案 一、Request-URI Too Large的原因 “Request-URI Too La…

Spring Bean 生命周期的执行流程

问题描述 Spring 生命周期全过程大致分为五个阶段: 1、创建前准备阶段 2、创建实例阶段 3、依赖注入阶段 4、 容器缓存阶段 5、销毁实例阶段 下图是 Spring Bean 生命周期完整流程图,其中对每个阶段的具体操作做了详细介绍: 一、创建前准备阶…

[ubuntu]创建root权限的用户

一、创建新用户 1、创建新用户 sudo useradd -r -m -s /bin/bash 用户名 # -r:建立系统账号 -m:自动建立用户的登入目录 -s:指定用户登入后所使用的shell2、手动为用户设置密码 passwd 用户名 二、为用户增加root权限 1、添加写权限 ch…

Android12.0 原生系统SystemUI下拉状态栏和通知栏视图之锁屏通知布局

1.前言 在12.0的系统rom定制化开发中,对于系统原生systemui的锁屏界面的功能也是非常重要的,所以在锁屏页面布局中,也是有通知栏布局的,所以接下来对于息屏亮屏 通知栏布局的相关流程分析,看下亮屏后锁屏页面做了哪些功能 2.原生系统SystemUI下拉状态栏和通知栏视图之锁…