深入Android架构(从线程到AIDL)_23 活用IBinder接口于近程通信01

news2025/1/12 13:13:25

1、 在同一进程里活用IBinder接口


议题

1. myActivity对象是谁创建的呢?

2. myService对象是谁创建的呢?

3. 当myService类里有个f1()函数,如何去调用它呢?

4. 必须先取得myService对象的指针,才能调用f1()函数去存取对象的属性(Attribute)值。

5. 那么,该如何才能取得myService对象的指 针呢?

6. 想一想,可以透过myService类的静态(static)属性或函数来取得myService对象的指针吗?

7. 可以透过IBinder接口来取得myService对象的指针吗?
 

活用IBinder接口
  • IBinder接口的重要目的是支持跨进程的远程调用。然而,它也应用于同一进程里的近程调用。
  • 例如,当Activity远程调用Service时,我们常用bindService()函数去绑定Service,取得对方的IBinder接口。
  • 在近程(同一进程内)调用时也可以使用bindService()函数去绑定Service,并取得对方的IBinder接口。
  • IBinder接口的典型实现类是Binder基类,其定义于Binder.java档案里。
  • 近程通信(同一进程里)如何使用IBinder接口呢?
  • 举例说明之。
  • 例如, myActivity和myService两者都执行于同一个进程(process)里,而且myActivity提供一个IS接口,其定义如下:

       interface IS {
                void f1();
                void f2();
        }

       现在, myActivity想要透过此IS接口来调用myService的函数;如下图:

        

2、 目的、议题与方法

  • 目的: myActivity想去直接(近程)调用myService类的函数, 例如IS接口里的f1()函数
  • 议题: 如何取的myService对象的IS接口呢?
  • 方法: 先取得myService对象的IBinder接口
步骤:

Step-1. myActivity透过bindService()函数来绑定(Bind)此myService。
Step-2. myService回传myBinder类的IBinder接口给myActivity。
Step-3. myActivity将IBinder接口转换为myBinder类的接口

Step-4. myActivity调用myBinder类的getService()函数,取得myService的IS接口。
Step-5. 于是, myActivity就能调用IS接口(由myService类实现)的函数了。

在Android 说明文件里,说明道:

第1步 
  • 当Android框架启动myService时,就立即执行:這诞生了myBinder对象。
           private final IBinder mBinder = new myBinder();

第2步
  • 随后,当myActivity调用bindService()时,框架会反向调用到myService的onBind()函数:

              public IBinder onBind(Intent intent)  { return mBinder; }

       其将 myBinder的IBinder接口回传给框架,并由框架调用onServiceConnected()函数,将此接口回传给myActivity。
       

 第3步
  • 由于myActivity与myService在同一个进程里执行, myActivity所获得的就是myBinder的真正接口(不是它的Proxy的);于是,执行:

                myBinder ib = (myBinder) ibinder;

  • 就从接获的IBinder接口转型(casting)为myBinder本身接口了。
     
第4步
  • 接着,执行:

                isv = ib.getService();

  • 这透过myBinder本身接口来调用getService()函数,取得了myService的IS接口。
第5步
  • 最后, myActivity就能透过IS接口来调用myService的f1()或f2()函数了。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2275500.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3后台系统动态路由实现

动态路由的流程:用户登录之后拿到用户信息和token,再去请求后端给的动态路由表,前端处理路由格式为vue路由格式。 1)拿到用户信息里面的角色之后再去请求路由表,返回的路由为tree格式 后端返回路由如下: …

如何开启苹果手机(IOS)系统的开发者模式?

如何开启开发者模式? 一、打开设置二、隐私与安全性三、找到开发者模式四、开启开发者模式------------------------------------------------------------如果发现没有开发者模式的选项一、电脑下载爱思助手二、连接手机三、工具箱——虚拟定位——打开虚拟定位——…

国产编辑器EverEdit - 扩展脚本:在当前文件目录下新建同类型文件

1 扩展脚本:在当前文件目录下新建同类型文件 1.1 应用场景 用户在进行编程语言学习时,比如:Python,经常做完一个小练习后,又需要新建一个文件,在新建文件的时候,不但要选择文件类型&#xff0c…

011:利用大津算法完成图片分割

本文为合集收录,欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 上一篇文章介绍了大津算法可以完成图片的前景和背景分割。 总的来说,大津算法的核心思想就两个: 数学上,通过确定一个像素阈值&#xf…

Jenkins触发器--在其他项目执行后构建

前言: jenkins中有多种触发器可用,可以方便的控制构建的启动 这里简单介绍下项目后构建的配置方法 1. 解释: Build after other projects are built Set up a trigger so that when some other projects finish building, a new build is…

PowerApps助力PowerBI实现数据写回

原文发布日期: 2019-08-01 06:03:50 0000 注:本文旨在介绍Power BI如何利用PowerApps实现用户在前端对数据源进行增删查改,关于此,你也可以在Google上找到更详细但较零散的资料 正文 在SSAS多维数据集中,开发者可以给数据开启&q…

oracle 19c安装

文章目录 一 环境配置1、更换yum源2、文件配置 二 oracle环境配置1、下载依赖包2、创建用户和用户组3、创建目录并赋予权限4、修改资源限制参数5、修改内核参数6、配置安全7、配置Oracle环境变量 三 安装Oracle数据库四 创建Oracle实例五 启动数据库 一 环境配置 1、更换yum源…

LabVIEW启动时Access Violation 0xC0000005错误

问题描述 在启动LabVIEW时,可能出现程序崩溃并提示以下错误:Error 0xC0000005 (Access Violation) ​ Access Violation错误通常是由于权限不足、文件冲突或驱动问题引起的。以下是解决此问题的全面优化方案: 解决步骤 1. 以管理员身份运行…

xilinx平台使用多个 FIFO 拼接

Xilinx FIFO IP 输入 的最大位宽 是 1024 bit ,当需要缓存的数据是 1280bit 又或者是 1536等 。怎么办呢? 有一个办法就是拆数据,将1280拆5个 256bit输入,也就是可以使用 5个 256位宽输入的FIFO拼接起来。(其它位宽也…

Ceph分布式存储集群,不仅仅是一个简单的对象存储解决方案

Ceph 作为 OpenStack 的存储后端 块存储(Cinder 后端) Ceph 的 RBD(RADOS Block Device)模块作为 OpenStack Cinder 服务的后端,为虚拟机提供块级别的存储资源。RBD 支持快照、克隆和恢复等功能,能够满足虚…

SD ComfyUI工作流 老照片修复上色

文章目录 老照片修复上色SD模型Node节点工作流程开发与应用效果展示老照片修复上色 该工作流专门设计用于老照片的修复和上色,通过一系列高级的图像处理技术,包括深度图预处理、面部修复、上色和图像放大等步骤,来恢复老照片的质量并增加色彩。首先,工作流加载老照片并进行…

Jmeter-压测时接口如何按照顺序执行

Jmeter-压测时接口如何按照顺序执行-临界部分控制器 在进行压力测试时,需要按照顺序进行压测,比如按照接口1、接口2、接口3、接口4 进行执行 查询结果是很混乱的,如果请求次数少,可能会按照顺序执行,但是随着次数增加…

Mysql--运维篇--日志管理(连接层,SQL层,存储引擎层,文件存储层)

MySQL提供了多种日志类型,用于记录不同的活动和事件。这些日志对于数据库的管理、故障排除、性能优化和安全审计非常重要。 一、错误日志 (Error Log) 作用: 记录MySQL服务器启动、运行和停止期间遇到的问题和错误信息。 查看: 默认情况下…

【2025 Rust学习 --- 13 闭包:Rust的Lambda】

Rust的Lambda — 闭包 对整型向量进行排序很容易: integers.sort(); 遗憾的是,当我们想对一些数据进行排序时,它们几乎从来都不是整型向量。例 如,对某种记录型数据来说,内置的 sort 方法一般不适用: st…

鸿蒙面试 2025-01-09

鸿蒙分布式理念?(个人认为理解就好) 鸿蒙操作系统的分布式理念主要体现在其独特的“流转”能力和相关的分布式操作上。在鸿蒙系统中,“流转”是指涉多端的分布式操作,它打破了设备之间的界限,实现了多设备…

一个基于Spring Boot的智慧养老平台

以下是一个基于Spring Boot的智慧养老平台的案例代码。这个平台包括老人信息管理、健康监测、紧急呼叫、服务预约等功能。代码结构清晰,适合初学者学习和参考。 1. 项目结构 src/main/java/com/example/smartelderlycare├── controller│ ├── ElderlyCon…

Taro+react 开发第一节创建 带有redux状态管理的项目

Taro 项目基于 node,请确保已具备较新的 node 环境(>16.20.0),推荐使用 node 版本管理工具 nvm 来管理 node,这样不仅可以很方便地切换 node 版本,而且全局安装时候也不用加 sudo 了。 1.安装 npm inf…

云商城--基础数据处理和分布式文件存储

第2章 基础数据处理和分布式文件存储 1.分布式文件存储系统Ceph学习 ​ 1).掌握Ceph架构 ​ 2).掌握Ceph组件 ​ 3).搭建Ceph集群(了解) 2.Ceph使用 ​ 1).基于Ceph实现文件上传 ​ 2).基于Ceph实现文件下载 3.SKU、SPU管理 ​ 1).掌握SKU和SPU关系 ​ 2).理解商品发…

Vue.js:现代前端开发的灵活框架

大家好!我是 [数擎 AI],一位热爱探索新技术的前端开发者,在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情,欢迎关注我的文章,我们一起成长、进步! 开发领域:前端开发 | A…

初学者关于对机器学习的理解

一、机器学习: 1、概念:是指从有限的观测数据中学习(或“猜 测”)出具有一般性的规律,并利用这些规律对未知数据进行预测的方法.机器学 习是人工智能的一个重要分支,并逐渐成为推动人工智能发展的关键因素。 2、使用机器学习模型…