千里马Android Framework实战开发-binder通信之Messenger介绍

离线安装vue脚手架,内网安装@vue/cli 公司开发环境使用内网,无法用外网,搭建环境的时候,发现内网系统没有安装vue脚手架,我搜了很多文章,发现他们的方法对我都不适用,然后就自己摸索,最终皇天不负有心人,终于被我安装上了,一下是我内网离线安装vue/cli的方法,希望能帮助到有需要的小伙伴! 因为npm被集成在nodejs中,而安装nodejs只需要把nodejs安装包copy到内网电脑安装就行,比较简单,这里就不多做演示。 在外网电脑上,使用npm install -g xxxx命令下载好我们所需要的各个安装包,比如: npm insta 阅读详情
AI摘要

本文详细介绍了Android中轻量级的跨进程通信方式——Messenger的使用,包括服务端和客户端的实现步骤。Messenger基于AIDL,但比AIDL更简单,适用于简单方法调用。服务端通过创建Handler并实现Message的处理,然后通过Binder返回Messenger对象。客户端则通过bindService获取服务端的Messenger,发送Message进行通信。Messenger的原理是内部实现了AIDL,提供了双向通信的能力。

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论

android跨进程通信实战视频课程(加群获取优惠)

Messenger是什么?

Messenger是基于AIDL实现的轻量级IPC方案。
这里立马就会有疑问为什么要它呢?明明有了aidl
上节课大家学完了aidl进行binder通信是否感觉到使用起来其实还是有点复杂,毕竟通信什么的要写aidl,而且客户端和服务端都需要aidl文件,两个过程里面都需要,相对来说还是比较麻烦,对于项目过程中可能就是一些简单的跨进程数据传递,就是调用几个非常非常简单的方法,很多觉得都要写aidl成本比较大,那么有没有更加简单的方案来解决这个问题呢?
那就是本节课要讲解的Messenger。
那么接下来直接讲他的使用过程:

1、服务端对Messenger的使用

服务端需要实现一个Handler用于处理客户端发来的跨进程通信信息:

 Handler messengerHandler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            switch (msg.what) {
                case  1:
                    Log.i("test","MessengerService Messenger handleMessage msg = " + msg + " bundle  key value = " + msg.getData().getString("bundleKey"));
                    Messenger clientSend = msg.replyTo;
                    Message toClientMsg = Message.obtain();
                    toClientMsg.what = 2;
                   // toClientMsg.obj = "I am replay from Server";
                    try {
                        clientSend.send(toClientMsg);
                    }catch (Exception e) {
                        Log.i("test","MessengerService clientSend  error ",e);
                    }
                    break;
            }
            super.handleMessage(msg);
        }
    };

其次服务端构造出对应的Messenger:
服务端构造:
Messenger messenger = new Messenger(messengerHandler);
注意这里参数是messengerHandler即一个Handler

最后,当服务端的onBinder回调时候要返回Messenger的IBinder对象给客户端

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return messenger.getBinder();
    }

2、客户端的使用

客户端还是和以前一样通过bindService在ServiceConnection类的onServiceConnected获取到服务端的返回的IBinder,从而获取到服务端的Messenger代理类,调用send函数发送Message。所以Messenger能发送的信息只有Message能携带的信息。

Intent intent = new Intent(MainActivity.this,MessengerService.class);
                Log.i("test","MessengerService  onClick ");
                bindService(intent, new ServiceConnection() {
                    @Override
                    public void onServiceConnected(ComponentName name, IBinder service) {
                        try {
                            Log.i("test","MessengerService  onServiceDisconnected name = " +name);
                            messengerServer = new Messenger(service);
                            sendMessageToServer();
                        } catch (Exception e) {
                            e.printStackTrace();
                            Log.i("test","error " ,e);
                        }
                    }

                    @Override
                    public void onServiceDisconnected(ComponentName name) {
                        Log.i("test","client onServiceDisconnected name = " +name);
                    }
                }, BIND_AUTO_CREATE);

	void sendMessageToServer() throws RemoteException {
        Message toServer = Message.obtain();
        toServer.replyTo = messengerClientSend;
        toServer.what = 1;
        //toServer.obj = "hello I send from client"; 注意不可以 传递非parcel的对象,这个只能给obj赋值为parcel类型对象否则报错
        Bundle bundle = new Bundle();
        bundle.putString("bundleKey","bundleValue Client");
        toServer.setData(bundle);
        messengerServer.send(toServer);
    }

大家这里注意客户端获取了服务端IBinder对象后,用它来构造客户端的Messenger,
messengerServer = new Messenger(service);
这里注意是和服务端不一样地方
有了服务端Messenger后,那么就可以通过它与服务端进行通信了,通信的内容载体是我们最为属性Message,对他就是和Handler搭配的Message,它就是具体消息体,即你需要发送什么消息,都是把内容转换成Message对象既可以,这里我们案例中传递一个Bundle的对象,这个Bundle对象可以利用键值对方式装载各种各样类型数据。和Intent传递数据Bundle是一样的。注意这里message对象还有一个属性是replyTo ,这个是Messenger类型的,字面意思就是说这个消息发送过去,如果对方需要回复,就可以通过消息中的replyTo 的Messenger对象来进行回复,这里是不是也和我们上节课讲的binder双向通信一样,所以说Messenger这种方式本身就相当于自带了双向通信

3 Messenger本质原理

Messenger其实本质上也是使用aidl进行实现了,只是这个aidl是在Framework层面进行写好了,不需要你写,你也就没有在意,没有看到。这里对他的源码进行分析一下:

public final class Messenger implements Parcelable {
    private final IMessenger mTarget;

    /**
     * Create a new Messenger pointing to the given Handler.  Any Message
     * objects sent through this Messenger will appear in the Handler as if
     * {@link Handler#sendMessage(Message) Handler.sendMessage(Message)} had
     * been called directly.
     * 
     * @param target The Handler that will receive sent messages.
     */
    public Messenger(Handler target) {
        mTarget = target.getIMessenger();//这个是handler对象获取IMessenger接口
    }
    
    /**
     * Send a Message to this Messenger's Handler.
     * 
     * @param message The Message to send.  Usually retrieved through
     * {@link Message#obtain() Message.obtain()}.
     * 
     * @throws RemoteException Throws DeadObjectException if the target
     * Handler no longer exists.
     */
    public void send(Message message) throws RemoteException {
        mTarget.send(message);//这其实调用是IMessenger接口的send
    }
    。。。。。省略
    }

代码中注释提到的handler对象获取IMessenger接口,IMessenger 接口到底又是什么呢?
目前我没没有看到有aidl啊。。。

Handler的getIMessenger

    @UnsupportedAppUsage
    final IMessenger getIMessenger() {
        synchronized (mQueue) {
            if (mMessenger != null) {
                return mMessenger;
            }
            mMessenger = new MessengerImpl();
            return mMessenger;
        }
    }
    private final class MessengerImpl extends IMessenger.Stub {
        public void send(Message msg) {
            msg.sendingUid = Binder.getCallingUid();
            Handler.this.sendMessage(msg);
        }
    }

大家看这里其实就是MessengerImpl ,是继承IMessenger.Stub,大家看到IMessenger.Stub是不是和aidl里面的接口和很熟悉啊。对它其实就是IMessenger.aidl文件生成的


package android.os;

import android.os.Message;

/** @hide */
oneway interface IMessenger {
    void send(in Message msg);
}

这里是不是看到期待已久的aidl了。。还是个oneway类型的哦

AHB总线协议 1. 简介         AHB总线规范是AMBA总线规范的一部分,AMBA总线规范是ARM公司提出的总线规范,被大多数SoC设计采用,它规定了AHB (Advanced High-performance Bus)、ASB (Advanced System Bus)、APB (Advanced Peripheral Bus)。AHB用于高性能、高时钟频率的系统结构,典型的应用如ARM核与系统内 阅读详情

相关推荐

Goldwasser-Micali 公钥加密系统

1、二次剩余问题 对于整数n ,定义Zn∗={a∈Zn,gcd(a,n)=1}Z^*_n=\{ a∈Z_n,gcd(a,n) =1\}Zn∗​={a∈Zn​,gcd(a,n)=1} 。当存在d∈Znd \in Z_nd∈Zn​ ,使得 d2≡a mod nd^2 \equiv a \, mod \,nd2≡amodn ,称 a 为模 n 的二次剩余;否则称 a 为模 n的二次非剩余。判断 a 是否为模 n 的二次剩余的问题称为模n 的二次剩余问题。 \rule[-10pt]{14.3cm}{0.05em}

不染心的博客 4314

千里马Android Framework实战开发-native程序之间binder通信实战案例分析

千里马Android Framework实战开发-native程序之间binder通信实战案例分析 1、需求背景 在android系统开发中,不仅仅我们都停留在java层面,很可能也会遇到比如一些native的可执行程序,比如surfaceflinger,bootanimation等他们都是native的执行程序,这些程序之间也经常会有要进行binder跨进程通信的需求,所以这个时候学习native层进行跨进程通信是非常有必要的。 2、案例功能介绍 在app的java层面我们之前已经实现过了binder的双

learnframework的博客 1692

在F1C100s上跑GBA游戏:手把手教你用Buildroot配置SDL和移植gpsp模拟器

本文详细介绍了在全志F1C100s开发板上配置Buildroot、移植SDL库和gpsp模拟器的完整流程,帮助开发者实现在ARM9平台上流畅运行GBA游戏。内容涵盖环境配置、交叉编译、常见问题解决及性能优化技巧,特别针对'段错误'和'无声音'等典型问题提供实用解决方案。

weixin_42566424的博客 398

千里马android binder深入分析-承上启下的native层(客户端部分)

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论 android跨进程通信实战视频课程(加群获取优惠) 相信大家对上面这一副binder跨进程通信的图都应该比较熟悉,图中的主要有4个角色: 1、客户端(A进程) 2、SerivceManager 3、服务端(B进程) 4、binder驱动 平时一问到binder是怎么跨进程通信的?那么同学们肯定大部分回答:binder最后调到底层还是通过binder驱动来实现跨进程通信的。那么这里就要问一下:请问android中ap

learnframework的博客 999

深入理解C++23的Deducing this特性(上):基础概念与语法详解

C++23标准中引入的"Deducing this"特性是一项重大革新,它不仅改变了我们编写成员函数的方式,还为模板元编程和设计模式实现带来了新的可能。

weixin_61470881的博客 1333

Libero SoC v2021.1离线安装与IP核配置全攻略

本文详细介绍了Libero SoC v2021.1在离线环境下的完整安装与配置流程。核心内容包括如何选择正确的离线安装包、获取并配置许可证、安装与挂载MegaVault IP库,以及将ModelSim仿真器切换至免费SE模式的关键步骤。文章旨在帮助内网开发者避开常见陷阱,顺利完成FPGA开发环境的搭建。

weixin_29279101的博客 408

千里马android framework开发解决Accessing hidden method限制,让应用访问隐藏方法(需要可以修改系统源码方案)

hi,粉丝朋友们大家好! 今天来给大家分享一下,就是经常大家会做安卓系统开发工作问到一个问题,那就是我如果framework代码中增加了一个方法啥的,但是我又不想公开给第三方应用知道,只想让我系统的应用知道,那该怎么办呢?其实这个时候经常就会用到一个hidden的标签,来代表这个方法是隐藏方法,隐藏方法就是给系统内部用的,意味着第三方app就无法使用。这个其实也很常见,自从android p开始android系统就开始对访问hidden的限制越来越严格,虽然我们网络上有各种奇葩招来逃避不允许调用hidden

learnframework的博客 1万+

vmvare kali如何配置桥接模式进行上网

注意点:虚拟机可以PING通物理机,但是PING不通其他的网站。经过收集资料,得知由于是校园网连接,所以DHCP只能分配一个授权的IP地址给连接的主机,由于KALI是桥接物理机,物理机已经获得了这个授权的IP,所以导致桥接的虚拟机无法上网。所以不是因为配置的有问题,而是网络的安全设置导致了桥接失败。如果你是使用校园网,可以换个网络试试,使用校园网的时候,可能会遇到桥接失败。

猿小白的博客 1409

HIDL实战开发-千里马android framework车载车技手机系统开发

上面default默认生成的bp是so,这里要把他变成可执行的服务,需要增加一个service.cpp作为main方法载体。需要在自己设备目录找到自己的manifest.xml然后加入自己的hidl。5、添加service.cpp,自启动rc,修改Android.bp。4、生成一个自动生成 hal 接口的 Android.bp。6、需要搞个test,来测试一下服务是否ok,这个时候需要。主要目的是把test目录的Android.bp可以加入编译。执行后生成如下Test.cpp,Test.h文件了。

learnframework的博客 2975

R语言机器学习算法实战系列(十五)随机森林生存预后模型+SHAP值 (Random Survival Forest + SHAP)

本教程运用随机森林生存分析筛选与患者生存状态显著相关特征。该方法借随机森林这一强大机器学习算法,构建多棵决策树并集成结果,以提高生存分析准确性,识别关键生物标志物。接着,利用选定特征构建风险得分,将多个特征转化为单一数值,量化患者风险水平。之后,依据风险得分将患者分为高、低风险亚型,为临床治疗提供个性化指导。最后,通过分析时间依赖的 ROC 曲线评估模型长期预测能力。此曲线计算不同阈值下的真正例率与假正例率,在多个时间点评估,全面展现模型长期稳定性与准确性。。并且增加了SHAP值评估特征重要性

专注生信领域 2623

万字长文解密:SAP Fiori 首屏加载缓慢背后的真相

什么是一个健康理想的 Fiori 首次加载状态?FLP 首页不臃肿,用户默认看见的内容不多但足够用缓存作业按规则运行,冷启动不至于每次都从零开始应用首屏只读必要数据,UI5 资源经过 preload,视图异步加载OData 服务字段克制、分页合理、缓存分层清楚后台 CDS 与 HANA 只为当前屏幕做最必要的工作。只要这些标准同时满足,用户第一次打开 Fiori 页面的体感通常会从明显卡顿变成可接受甚至顺滑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 557

Android 经典hal开发实战-千里马android framework车载车机手机系统开发

上面的load方法就是我们说的hardware动态性的关键,它是在运行时候才真正依赖具体硬件抽象so,编译期间只需要依赖公共的hardware相关公共类既可以,不需要so,所以这里就给硬件抽象提供商带来很大灵活性,哪怕硬件厂商不提供也一般会有一个default的so保证不会产生什么严重的崩溃和强依赖问题,大大减低了aosp的代码对于硬件抽象的各个厂商的耦合性。在结构体 hw_module_methods_t 中只有一个成员,它是一个函数指针,名字是open,它主要作用就是用来打开硬件抽象层中给的硬件设备。

learnframework的博客 2783

Playwright实战:打造绕过全维度前端反爬的无头浏览器爬虫(2026实战版)

Playwright绕过前端反爬的核心是模拟真实:真实的设备指纹、真实的行为轨迹、真实的网络请求;2025年前端反爬的核心检测维度是设备指纹+行为轨迹+网络请求,三者缺一不可;实战中需重点关注WebGL/Canvas指纹模拟、行为随机性、请求头完整性,这是绕过反爬的关键;性能优化需以“不触发反爬”为前提,优先选择浏览器复用、资源拦截,而非无限制并发。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2094

千里马Android Framework实战开发-跨进程通信专题博客总结

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论 FrameWork入门课视频链接:https://edu.youkuaiyun.com/course/detail/30298 FrameWork实战课1视频链接:https://edu.youkuaiyun.com/course/detail/30275 android跨进程通信实战视频课程(加群获取优惠) 千里马Android Framework实战开发-跨进程通信专题介绍 1、跨进程通信之课程介绍 1 binder高级 应用程序app的

liaosongmao1的专栏 346

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

千里马android framework车机车载手机智能驾驶双屏互动实现方案

这个就是没有动画版本的双屏互动,功能其实也是实现的,但是体验是不是感觉起来差的太多,而且还带有黑屏。2、画面A的平移,两个屏幕都要进行显示,这个难度较大,得考虑好相关的画面怎么都可以显示在两个屏幕。这里其实不需要写代码,可以直接调用am display相关的命令即可以实现这个方法的调用。不过还好的是功能可以用,那么我们也根据wms课程基础后也来实现一下这个双屏互动的功能。1、多指全局动作监听,而不是在某个app的onTouch里面监听,这里其实之前的。

learnframework的博客 5967

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

clearCallingIdentity与restoreCallingIdentity-千里马framework系统源码实战详解

hi,粉丝朋友大家好:今天带大家来学习一个系统开发过程中大家即“熟悉”又陌生的两个方法,分别是clearCallingIdentity和restoreCallingIdentity,一般他们是成对出现在我们的framework代码中,但大家平时分析源码时候好像并没有在意他的真正作用是什么?为啥在框架代码分析时候可以看到他的大量出现?

learnframework的博客 1308

千里马Android Framework实战开发-binder驱动常见binder_open,binder_mmap介绍

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论 android跨进程通信实战视频课程(加群获取优惠) 背景知识: 大家经常听到的驱动驱动,是不是一般都会有与一个具体的硬件设备相关,比如说wifi驱动,触摸屏驱动等。binder驱动是不是也是会有一个对应的一个硬件设备呢?哈哈,这里要告诉大家是没有的,因为binder本身只是用于操作系统进程间一个通讯而已,只涉及一些内存的拷贝,并不需要额外的硬件来支持,和linux常见的socket,共享内存,等一样哈。所以binde

liaosongmao1的专栏 362

千里马Android Framework实战开发-Binder通信之startActivity跨进程源码分析

上节课我们已经讲解完了Binder常见使用的一些方法,下面这节课我们来讲解一些Binder跨进程通信在平时Framework及SystemServer源码分析场景。 (注意这个分析是基于我们的android 10,因为课程上讲过android 8.1,也相对比较清楚了,这里blog就单独写一下android 10,因为和8.1有一些差异,这样可以多学习到android 10的情况) 首先我们来看一副图: 1、 startActivity源码分析 上面是不是我们常见的一种App与系统SystemServer

learnframework的博客 1022

binder通信之Messenger介绍

Messenger是什么?Messenger是基于AIDL实现的轻量级IPC方案。这里立马就会有疑问为什么要它呢?明明有了aidl上节课大家学完了aidl进行binder通信是否感觉到使用起来其实还是有点复杂,毕竟通信什么的要写aidl,而且客户端和服务端都需要aidl文件,两个过程里面都需要,相对来说还是比较麻烦,对于项目过程中可能就是一些简单的跨进程数据传递,就是调用几个非常非常简单的方法,很多觉得都要写aidl成本比较大,那么有没有更加简单的方案来解决这个问题呢?

qq_34888036的博客 495

千里马2024年终总结-android framework实战

心里焦虑加大了,需要调节好平常心面对创业以来最大感受就是“创业艰难”,原本预想的很美好,终于可以有勇气为了理想和兴趣奋斗了,一定是每天满怀激情的干。实际情况是:当自己的兴趣与谋生的收入挂钩时候,一切变得不那么理想和美好。每天还是会有担心自己课程的销售情况,必然就会有焦虑,这种心态和上班兼职搞完全不是一回事。所以心态上确实是相比以前有焦虑一些,这个部分做的不够好。时间不够用创业初期,也没有很多资金搞团队,大部分工作都落到我的头上,比如一些售前咨询,课程研发录制,答疑服务等。

liaosongmao1的专栏 308

千里马Android Framework实战课程-应用程序app的Binder启动篇

上一个学习专题zygote启动app进程时候,有简单讲过一下binder启动,但没有详细进行分析。这一节进行重点详细分析。 ProcessState的启动 sp<ProcessState> ProcessState::self() { Mutex::Autolock _l(gProcessMutex); if (gProcess != nullptr) { return gProcess; } gProcess = new ProcessState

learnframework的博客 3075

【Android】IPC 之 AIDL、Messenger 、Binder 浅析

- 使用 Binder 类实现绑定服务和**同进程**组件之间的通信 - 使用 Messenger 实现绑定服务和**不同进程**组件之间的通信 - 使用 AIDL 实现绑定服务和**不同进程**组件之间的通信

yang553566463的博客 797
上一篇: Android Framework实战开发-binder通信常见(oneway,in,out,inout)元素介绍及binder双向通信的实现
下一篇: 千里马Android Framework实战开发-Binder通信之startActivity跨进程源码分析
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值