深入Android架构(从线程到AIDL)_27 Messager框架与IMessager接口03

devtools/2025/1/15 9:44:28/

目录

3、 双向沟通的Messenger框架

基本設計原則

4、 IMessenger接口

AIDL-toc" style="margin-left:120px;">使用AIDL


3、 双向沟通的Messenger框架

  • 这个Messenger框架是对Binder框架加以扩充而来的。 在双向沟通上,也继承了Binder框架机制。
  • Binder框架双向沟通的应用情境是:当myActivity透过IBinder接口调用myService的函数去执行任务时(例如使用子线程去播放mp3音乐),万一发现底层播放系统故障了,则myService必须透过IBinder接口来通知myActivity。
  • 基于上述的IBinder双向通信机制,就能用Messenger来加以包装,而为跨进程双向的Messenger框架,如下图:

         

基本設計原則
  • 已知: myActivity透过Android框架去配对才取得myService对象,然后才取得myService所在进程里的IBinder接口。
  • 议题: 那么, myService又如何取得myActivity进程里的IBinder接口呢?
  • 答案: myActivity先将IBinder接口打包到信件(Message对象)里,随着信送到对方,对方(myActivity)就接到IBinder接口了。
     
// myActivity.java
public class myActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//………bindService(intent, connection, BIND_AUTO_CREATE);}class myHandler extends Handler {@Override public void handleMessage(Message msg) {// ........}};final Messenger aMessenger = new Messenger(new myHandler());private Messenger ibMessenger;private ServiceConnection connection = new ServiceConnection() {public void onServiceConnected(ComponentName name,IBinder ibinder) {ibMessenger = new Messenger(ibinder);}};public void onClick(View v) {Message message = Message.obtain(null, MessengerService.MSG_SET_VALUE);message.replyTo = aMessenger;ibMessenger.send(message);}
}// myService.java
// ………
public class myService extends Service {private Messenger cbMessenger;class myHandler extends Handler {@Override public void handleMessage(Message msg) {Message message = Message.obtain(null, 0, “How are you”);cbMessenger = msg.replyTo;cbMessenger.send(message);}};final Messenger mMessenger = new Messenger(new myHandler());@Override public IBinder onBind(Intent intent) {return mMessenger.getBinder();}
}

myActivity的代码:
            final Messenger aMessenger  = new Messenger(new myHandler());

myService的代码:
            final Messenger mMessenger = new Messenger(new myHandler());


 

myActivity的代码:
              bindService(intent, connection, BIND_AUTO_CREATE);

myService的代码:
              return mMessenger.getBinder();

myActivity的代码:
              public void onServiceConnected(ComponentName name, IBinder ibinder) {
                                             ibMessenger = new Messenger(ibinder);

 

myActivity的代码:
                   message.replyTo = aMessenger;
                                           ibMessenger.send(message)

 

myService的代码:
                 @Override public void handleMessage(Message msg) {
                               Message message = Message.obtain(null, 0, “How are you”);
                               cbMessenger = msg.replyTo;
                               cbMessenger.send(message);

  • 在myActivity调用Messenger的send()函数时,就顺便将己方的IBinder接口当作参数传递过去给myService。
  • myService接到传递过来的IBinder接口时,就诞生一个新Messenger对象,并将该IBinder接口存进去。 myService就能调用该新Messenger对象的send()函数,把Message对象传递到myActivity端了。
     

4、 IMessenger接口

AIDL">使用AIDL
  • 在Messenger框架里还定义了IMessenger接口, 让应用程序(App)可直接调用IMessenger接口的send()函数。如下图:
  • 这是典型的Proxy-Stub模式来包装IBinder接口。
  • 在myActivity进程里: Messenger类可以将IBinder接口转换成为IMessenger接口。
  • 在myService进程里:也可以透过Messenger取得MessengerImpl类的IMessenger接口。
     

http://www.ppmy.cn/devtools/150336.html

相关文章

求矩阵不靠边元素之和(PTA)C语言

求矩阵的所有不靠边元素之和&#xff0c;矩阵行的值m从键盘读入(2<m<10)&#xff0c;调用自定义函数Input实现矩阵元素从键盘输入&#xff0c;调用Sum函数实现求和。(只考虑float型&#xff0c;且不需考虑求和的结果可能超出float型能表示的范围)。 函数接口定义&#x…

R语言的数据库编程

R语言的数据库编程 引言 在当今大数据时代&#xff0c;数据分析已成为推动各行业发展的重要力量。R语言&#xff0c;作为一种专为统计分析和数据挖掘而设计的编程语言&#xff0c;逐渐成为数据科学家和分析师的首选工具。然而&#xff0c;仅仅使用R语言进行数据分析往往无法满…

将node节点加入k8s集群

1、k8s master集群安装完成之后即可以开始将node节点加入到集群 2、首先要进行基础环境的配置&#xff0c;包括关闭防火墙、关闭selinux&#xff0c;关闭swap分区&#xff0c;这都是基础操作&#xff0c;不在粘贴代码。 3、进行yum源的配置&#xff0c;这里最简单方法是把mas…

Python 扫描枪读取发票数据导入Excel

财务需要一个扫描枪扫描发票文件&#xff0c;并将主要信息录入Excel 的功能。 文件中sheet表的列名称&#xff0c;依次为&#xff1a;发票编号、发票编码、日期、金额、工号、扫描日期。 扫描的时候&#xff0c;Excel 文件需要关闭&#xff0c;否则会报错。 import openpyxl …

计算机网络之---公钥基础设施(PKI)

公钥基础设施 公钥基础设施&#xff08;PKI&#xff0c;Public Key Infrastructure&#xff09; 是一种用于管理公钥加密的系统架构&#xff0c;它通过结合硬件、软件、策略和标准来确保数字通信的安全性。PKI 提供了必要的框架&#xff0c;用于管理密钥对&#xff08;包括公钥…

基于 Selenium 实现上海大学校园网自动登录

基于 Selenium 实现上海大学校园网自动登录 一、技术方案 核心工具&#xff1a; Selenium&#xff1a;一个用于自动化测试的工具&#xff0c;能够模拟用户在浏览器上的操作。Edge WebDriver&#xff1a;用于控制 Edge 浏览器的驱动程序。 功能设计&#xff1a; 检测网络状…

MVC执行流程

&#xff08;1&#xff09;用户通过浏览器&#xff08;客户端&#xff09;向服务端&#xff08;后端&#xff09;发送请求&#xff0c;请求会被前端控制器DispatcherServlet拦截。 &#xff08;2&#xff09;DispatcherServlet拦截到请求后&#xff0c;会调用处理器映射器&…

如何在后端使用redis进行缓存,任意一种语言都可以

在后端使用 Redis 可以显著提升应用的性能&#xff0c;特别是在处理高并发请求、缓存数据、会话管理、消息队列等场景。以下是关于如何在 Spring Boot 项目中集成和使用 Redis 的详细讲解。 1. 添加依赖 首先&#xff0c;在 pom.xml 文件中添加 Redis 相关的依赖。Spring Boo…