首页 > 系统相关 >Android开发 - Binder 类进程间通信(IPC)的机制解析

Android开发 - Binder 类进程间通信(IPC)的机制解析

时间:2024-08-24 15:54:28浏览次数:10  
标签:IPC Service MyService 间通信 Binder 进程 public MyBinder

什么是 Binder

  • Binder 是一种用于进程间通信(IPC)的机制允许不同的进程(或者不同的组件)相互交互,提供了跨进程通信(IPC)的基础。它允许一个进程中的对象(如服务)被另一个进程中的代码(如应用组件)调用Binder 是一种特殊的对象,它能够在不同进程之间传递数据和调用方法

Binder 的作用

  • 进程间通信Binder 允许不同进程之间交换数据和调用方法,使得一个进程能够访问另一个进程的服务

  • 服务与客户端交互:在 Android 中,Binder 通常用于服务(Service)和客户端(如 Activity)之间的通信

Binder 的工作流程

  1. 创建 Binder 类:首先需要创建一个 Binder 类,通常这个类会继承自 Binder 类,并定义你希望公开给其他进程的方法

  2. 实现 Service在 Service 中创建一个 Binder 实例并返回它,这样客户端就可以通过这个 Binder 实例与 Service 进行交互

  3. 绑定 Service客户端(如 Activity)通过绑定到 Service 来获取 Binder 实例,从而调用 Service 的方法

示例代码

  • 使用 Binder 进行进程间通信:这个例子创建了一个简单的 Service,它使用 Binder 允许客户端调用它的方法

    1. 创建 Binder 类

      // MyBinder 继承自 Binder 类
      public class MyBinder extends Binder {
          private final MyService service;
      	
          public MyBinder(MyService service) {
              this.service = service;
          }
      
          // 提供给客户端调用的方法
          // 持有对 MyService 的引用,允许客户端通过 getService() 方法访问 MyService
          public MyService getService() {
              return service;
          }
      }
      
    2. 实现 Service 类

      // MyService 是一个 Service
      public class MyService extends Service {
      
          private final IBinder binder = new MyBinder(this);
      
          // onBind() 方法返回一个 IBinder 对象,即 MyBinder 实例。客户端通过这个 Binder 实例与 Service 进行交互
          @Override
          public IBinder onBind(Intent intent) {
              // 返回自定义的 Binder 实例
              return binder;
          }
      
          // 定义 Service 的具体操作
          public void doSomething() {
              Log.d("MyService", "Doing something...");
          }
      }
      
      
    3. 绑定 Service 类

      public class MainActivity extends AppCompatActivity {
      
          private MyService myService;
          private boolean bound = false;
      
          // ServiceConnection 是一个回调接口,用于处理与 Service 的连接
          private ServiceConnection connection = new ServiceConnection() {
      
              // onServiceConnected() 方法在连接成功时调用,将 IBinder 转换为 MyBinder 实例,并获取 MyService
              @Override
              public void onServiceConnected(ComponentName className, IBinder service) {
                  // 将 IBinder 转换为 MyBinder
                  MyBinder binder = (MyBinder) service;
                  myService = binder.getService();
                  bound = true;
              }
      
              @Override
              public void onServiceDisconnected(ComponentName arg0) {
                  bound = false;
              }
          };
      
          @Override
          protected void onStart() {
              super.onStart();
              // 绑定到 Service
              Intent intent = new Intent(this, MyService.class);
              // bindService() 用于绑定到 Service
              bindService(intent, connection, Context.BIND_AUTO_CREATE);
          }
      
          @Override
          protected void onStop() {
              super.onStop();
              // 解绑 Service
              if (bound) {
                  // unbindService() 用于解绑
                  unbindService(connection);
                  bound = false;
              }
          }
      
          // 调用 Service 的方法
          // callServiceMethod() 方法调用了 MyService 的 doSomething() 方法
          private void callServiceMethod() {
              if (bound) {
                  myService.doSomething();
              }
          }
      }
      

总结

  • BinderAndroid 系统提供的一个强大机制,用于实现进程间通信。它通过创建 Binder 类实现 Service绑定 Service,使得不同进程或组件可以互相调用方法和交换数据

标签:IPC,Service,MyService,间通信,Binder,进程,public,MyBinder
From: https://www.cnblogs.com/ajunjava/p/18377856

相关文章

  • Android开发 - IBinder 类实现跨进程通信(IPC)解析
    什么是IBinderIBinder类是一个重要的接口,常用于实现跨进程通信(IPC);IBinder允许不同的进程或组件之间相互传递数据和调用方法。主要用于实现进程间通信。它是Android中的一个底层机制,允许不同的应用或组件(即使它们在不同的进程中)通过IBinder对象进行数据交换和方法调用IB......
  • 重头开始嵌入式第二十六天(Linux系统编程 进程间通信 IPC)
    目录IPC进程间通信1.管道通信管道的特性使用流程无名管道1.创建并打开管道:2.无名管道的读写:3.关闭管道: close();4.使用例子:有名管道1、创建:mkfifo2、打开有名管道 open3、管道的读写: 文件IO4、关闭管道:5、卸载管道:remove();IPC进程间通信进程间通信(In......
  • 进程间通信方式详解
    正文每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核。Linux内核提供了不少进程间通信的机制,我们来一起瞧瞧有哪些?管道如果你学过Linux命令,那你肯定很熟悉「|」这个竖线。$psauxf|grep......
  • IPC对象通信方式---共享内存 | 网络通信 -编程
    共享内存共享内存机制其允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或两个以上的进程映射至自身的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读取错做读出,从而实现了进程间的通信。是内核预留的内存空间,最......
  • XSI机制的进程间通信
    XSI机制的进程间通信1、XSI介绍:什么是XSI:X/Open国际联盟有限公司是一个欧洲基金会,它的建立是为了向UNIX环境提供标准,XSI是X/OpenSystemInterface的缩写,也就是X/Open设计的系统接口。X/Open的主要的目标是促进对UNIX系统、接口、网络和应用的开放式系统协议的制定。它还促......
  • VisualStudio 产生的.sdf和.ipch文件删除、不生成
    前言全局说明VisualStudio产生的.sdf和.ipch文件删除、不生成一、说明环境:Windows7旗舰版VisualStudio2013二、原因某天,打算给vs2013的一个工程,打包备份,打包后,发现压缩包有90MB,看到数字确实很惊讶。因为这个工程就是画了几个按钮的小功能,怎么会这么大。......
  • .net core 微服务间通信 消息总线更新 利用GRPC restful 优缺点
     在.NETCore微服务架构中,微服务间的通信是一个核心问题,而消息总线的更新则涉及到微服务间的动态配置和状态同步。关于使用gRPC和RESTfulAPI在微服务间通信的优缺点,以及它们在消息总线更新中的应用,可以从以下几个方面进行详细分析:一、gRPC的优缺点优点:高效性:gRPC使用Prot......
  • Kubernetes中Pod间通信的详细解析
    目录同一个节点中Pod通信原理网络拓扑结构通信过程不同节点上的Pod通信原理网络拓扑结构通信过程同一个节点中Pod通信原理网络拓扑结构Pod:每个Pod都有一个唯一的IP地址(例如,172.16.3.2和172.16.3.3)。Pod内部的网络接口(eth0)连接到一个虚拟网络设备(veth)。虚拟网络设备(vethp......
  • 安卓笔记—binder
    binder的c实现代码我没有读,下面的笔记都是从文章中学习的https://elinux.org/Android_Binderbinder有哪些功能?跨进程传输数据,跨进程传递时机。进程是分配内存的最小单位,因此进程间不共享内存。但是内核与进程之间是一对多的关系,也就是一个内核对应多个进程,因此binder......
  • 进程间通信IPC
    前言        进程是操作系统中独立运行的程序单元,每个进程拥有自己的内存空间。由于进程之间的内存空间是隔离的,不能直接访问彼此的内存,因此需要借助IPC来实现进程间的数据交换一.管道进程间通信的本质是让不同的进程看到同一份资源, 我们先来看管道是如何做到的......