安卓跨进程通信:Messenger、AIDL远程Service 使用

Android中的Service:Binder,Messenger,AIDL(2) 前言前面一篇博文介绍了关于Service的一些基本知识,包括service是什么,怎么创建一个service,创建了一个service之后如何启动它等等。在这一篇博文里有一些需要前一篇铺垫的东西,建议没有看过前一篇博文的同学先去看一下前一篇: Android中的Service:默默的奉献者 (1) 。但是在前一篇博文中也有一些遗漏的东西——主要是关于bindService()这一块的具体细节。由于这 阅读详情

Messenger

服务端

创建Service:

public class MessengerService extends Service {
    private static final int MSG_SUM = 0x110;
    private Messenger messenger = new Messenger(new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            Message message = Message.obtain(msg);
            switch (msg.what) {
                case MSG_SUM:
                    message.what = MSG_SUM;
                    try {
                        Thread.sleep(2000);
                        message.arg2 = msg.arg1 + msg.arg2;
                        msg.replyTo.send(message);
                    } catch (InterruptedException | RemoteException e) {
                        e.printStackTrace();
                    }
                    break;
                default:
                    break;
            }
            super.handleMessage(msg);
        }
    });

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

在Service中创建Messenger实例,通过Message消息机制进行操作,Service的onBind中返回messenger实例的Binder对象。

注册service:

<service
    android:name=".MessengerService"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="com.example.messengerserver" />
    </intent-filter>
</service>

此处action值随意设置,后续和intent的action匹配即可。

客户端

public class MainActivity extends AppCompatActivity {
    private static final int MSG_SUM = 0x110;

    private Button button;
    private LinearLayout layout;
    private TextView mTvState;

    private Messenger mService;
    private boolean isConn;

    private Messenger mMessenger = new Messenger(new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            switch (msg.what) {
                case MSG_SUM:
                    TextView tv = (TextView) layout.findViewById(msg.arg1);
                    tv.setText(tv.getText() + "=>" + msg.arg2);
                    break;
            }
            super.handleMessage(msg);
        }
    });

    private ServiceConnection mConn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            mService = new Messenger(iBinder);
            isConn = true;
            mTvState.setText("conn");
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            mService = null;
            isConn = false;
            mTvState.setText("dis");
        }
    };

    private int mA;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = new Intent();
//        intent.setAction("com.example.messengerserver");
        intent.setPackage("com.example.messengerserver");
        bindService(intent, mConn, BIND_AUTO_CREATE);

        mTvState = (TextView) findViewById(R.id.id_tv_callback);
        button = (Button) findViewById(R.id.id_btn_add);
        layout = (LinearLayout) findViewById(R.id.id_ll_container);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    int a = mA++;
                    int b = (int) (Math.random() * 100);

                    //创建一个tv,添加到LinearLayout中
                    TextView tv = new TextView(MainActivity.this);
                    tv.setText(a + " + " + b + " = caculating ...");
                    tv.setId(a);
                    layout.addView(tv);

                    Message msg = Message.obtain(null, MSG_SUM, a, b);
                    msg.replyTo = mMessenger;
                    if (isConn) {
                        mService.send(msg);
                    }
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

注:
①intent设置:隐式必须声明package为service所在包名(而action不必声明,但若声明则必须和服务端设置的action相同,否则service绑定失败)
②ServiceConnection为连接、断开的回调方法
③流程:
a、客户端与服务端通过service绑定成功后,调用ServiceConnection回调方法,客户端依据返回的binder生成给服务端发送信息的messenger

mService = new Messenger(iBinder);

b、客户端创建message给服务端发送

Message msg = Message.obtain(null, MSG_SUM, a, b);
msg.replyTo = mMessenger;		//此处绑定客户端的Messenger,用于接收信息时触发此处的handleMessage
if (isConn) {
    mService.send(msg);
}

c、服务端接收信息进行数据处理并给在message绑定好的Messenger发送信息

message.arg2 = msg.arg1 + msg.arg2;
msg.replyTo.send(message);

发送回客户端后触发handleMessage

AIDL+远程Service

服务端

在这里插入图片描述

interface IPersonAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
     void setName(String name);
     void setAge(int age);
     String getInfo();
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);
}

创建aidl文件夹及包+aidl文件(包名需与java文件夹内包相同)
aidl文件创建后,makeProject再继续编写。

public class PersonService extends Service {
    public PersonService() {
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new IPersonImpl();
    }

    public class IPersonImpl extends IPersonAidlInterface.Stub {
        private String name;
        private int age;

        @Override
        public void setName(String name) throws RemoteException {
            this.name = name;
            Log.i("server", name);
        }

        @Override
        public void setAge(int age) throws RemoteException {
            this.age = age;
        }

        @Override
        public String getInfo() throws RemoteException {
            return "My name is "+name+", age is "+age+"!";
        }

        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

        }
    }
}

创建aidl.stub子类,重写方法逻辑,在Service的onbind返回stub实例。

声明service:

<service android:name=".PersonService"
    android:enabled="true"
    android:exported="true"
    android:process=":remote">
    <intent-filter>
        <action android:name="com.example.aidlserver" />
    </intent-filter>
</service>

此处注意点同messenger

客户端

在这里插入图片描述
将服务端创建的aidl文件夹复制到客户端中,再makeProject

public class MainActivity extends AppCompatActivity {
    private IPersonAidlInterface iPersonAidlInterface;
    TextView textView;
    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            iPersonAidlInterface = IPersonAidlInterface.Stub.asInterface(iBinder);
            try {
                iPersonAidlInterface.setName("123");
                textView.setText(iPersonAidlInterface.getInfo());

            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.text);
        Intent intent = new Intent();
//        intent.setAction("com.example.aidlserver");
        intent.setPackage("com.example.aidlserver");
        bindService(intent, serviceConnection, BIND_AUTO_CREATE);
    }

}

注:
①在ServiceConnection中主要执行iPersonAidlInterface = IPersonAidlInterface.Stub.asInterface(iBinder);,后续通过iPersonAidlInterface即可调用服务端方法
②服务绑定注意点与方法和Messenger相同

对比

Messenger主要通过Message消息机制进行通信,省去了AIDL接口的编写与实现
两者都需要通过Service进行服务端、客户端关系绑定,绑定后再实现通信。

Android Service绑定与跨进程通信 Android 绑定服务与跨进程通信 阅读详情

相关推荐

Android语言基础教程(239)Android创建Bound Service之使用Messenger类:[特殊字符] 用Messenger让跨进程通信so easy!

本文深度解析Android中如何使用Messenger创建Bound Service实现跨进程通信。从基本概念、工作原理到完整示例代码,详细讲解服务端和客户端的实现步骤,涵盖双向通信、死亡通知等进阶用法,并对比Messenger与AIDL的优劣,帮助开发者轻松掌握这一重要IPC机制。

jxf_jxfcsdn的博客 691

Android Messenger(跨进程)

1.Messager 我们知道,Service通过IBinder可以实现同一应用内同一进程的通信,而不同进程间的通信,最简单的方式就是使用Messenger服务提供通信接口。利用Messager,我们无需使用AIDL便可执行进程间通信 (IPC)。 首先看一下Messager的定义:允许实现基于消息的进程间通信的方式。 以下是Messenger使用的主要步骤: ①服务Service实现一个Handler,由其接收来自客户端的每个调用的回调; ②Handler用于创建Messenger对象(对Handler的

zenmela2011的专栏 3572

安卓Messenger跨进程双向通信

要实现IPC(跨进程通信),可以使用官方给我们提供的Messenger机制和AIDL机制。 其中Messenger使用简单,适用于大部分多进程、单线程的应用, AIDL适用于较为复杂的多进程、多线程的应用。 这里我们介绍Messenger的用法,其底层也是使用AIDL实现的。 来看下Messenger用法 Reference to a Handler, which others can use ...

LuckyDucky的博客 1089

Android service介绍——跨进程之Messenger方式介绍和源码初步梳理(2)

Android service介绍——跨进程之Messenger方式介绍和源码初步梳理(2) 问题背景 前一篇文章介绍了service的基本使用(参考 https://blog.51cto.com/baorant24/6091264 ),包括使用startService和bindService两种启动方式,其中介绍通过bi...

baorant24的博客 429

Android 进阶——轻量级跨进程传递Message利器Messenger详解

Messenger是基于消息Message的传递的一种轻量级IPC进程间通信方式(通过在一个进程中创建一个指向Handler的Messenger,并将该Messenger传递给另一个进程),当然本质就是对Binder的封装(也是通过AIDL实现的 )。

最美不过,心中有梦,身旁有你! 6098

Android进程间通信实战:Intent、Messenger与AIDL全面解析

在Android系统中,进程间通信(IPC,Inter-Process Communication)是构建高性能、模块化应用架构的核心机制。由于Android基于Linux内核,每个应用默认运行在独立的进程中,拥有独立的内存空间,这种进程隔离机制有效提升了系统的稳定性和安全性。然而,这也带来了不同进程之间数据共享和通信的难题,因此需要引入IPC机制来实现跨进程的数据交换。常见的IPC机制包括:等。

weixin_28721743的博客 793

Android 进程与进程之间的通信--Messager 详细教程,两个app实现

Messenger是一种轻量级的IPC方案,它的底层实现其实就是AIDL.跨进程通信使用Messenger时,Messenger会将所有服务调用加入队列,然后服务端那边一次处理一个调用,不会存在同时调用的情况.而AIDL则可能是多个调用同时执行,必须处理多线程问。

afufufufu的博客 1308

android中跨进程通讯的4种方式

由于android系统中应用程序之间不能共享内存。因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些。在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service。其中Activity可以跨进程调用其他应用程序的Activity;Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可以对其他应用程序的数据进行增、删、改操 作;Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播;Service和Content Provider类似,也可以访问其他应用程序中的数据,但不同的是,Content Provider返回的是Cursor对象,而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务。

Android进程间通信 Messenger详解

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!

2401_84520182的博客 1157

车载监控系统升级指南:如何用XS9950A替换TP9950实现高清视频解码(附配置代码)

本文提供了从TP9950升级至XS9950A车载视频解码芯片的完整实战指南。详细解析了硬件设计调整、PCB布局要点,并重点分享了通过I2C配置寄存器实现高清HDCCTV视频解码与同轴音频集成的软件驱动代码与调试技巧,助力工程师平滑完成系统升级。

weixin_29268637的博客 364

SRA数据下载的一个坑

SRA数据真坑啊!

xuzhougeng blog 3508

AIDL 和Messenger相同点与区别

AIDL和Messenger各有优劣,选择使用哪种机制应根据具体的应用需求、数据的复杂性和通信的频率来决定。如果需要高效的消息传递且数据结构较简单,Messenger是一个很好的选择;而当需要处理复杂的数据对象和多种方法调用时,AIDL则更为合适。AIDL(Android Interface Definition Language)和Messenger都是Android中用于跨进程通信(IPC)的机制,但它们在设计、使用场景和实现细节上有一些相似之处和明显的区别。

qq_34358193的博客 630

IFIX数据库Datebase当前值问号

IFIX数据库Datebase当前值问号,已解决,亲测有效 在OPC PowerTool有数据的情况下,IFIX数据库Datebase当前值显示???? 问题分析及解决方法 我的IFIX5.8版本,其它版本可参考 打开IFIX工作台:应用程序–任务控制–I/O驱动–OPC Client;查看OPC驱动是否被禁用,点击启动,变成激活状态即可;若点击启动无法激活OPC驱动,需要重新安装OPC驱动,方法如下: 下载I/O Driver文件 下载链接:https://download.youkuaiyun.com/down

Ron_Tso的博客 2759

【Android】跨进程通信——AIDL、之Service基本细节使用之:精通

入门及高级进阶Android组件 Service

学习只为当小狗狗,学习只为当小狗狗,学习只为当小狗狗,学习只为当小狗狗,学习只为当小狗狗,学习只为当小狗狗,学习只为当小狗狗 7372

基于Python批量获取过去某地某时的天气数据

此段代码为经Visual Weather API官网样例后修改。原代码返回数据格式为json,经测试json风速字段不可用,后改为返回数据格式为csv。若修改weather_api_endpoint,还可获取该地点的预测数据,但返回数据字段可能发生变化,请以官网文档为准。获取到的字段包括:平均温度、露点、湿度、风速、降雨量、能见度、云量、天气类型等。目的:已知某一地址,获取过去某一时间该地的天气数据,并能够批量运行。这一步也会有获取不到的时间和地点,因此为空白。此段代码为经百度地图api官网样例后修改。

wiseman1233的博客 904

基于YOLOv26的护栏损坏检测系统原理讲解

本文介绍了一种基于YOLOv26深度学习的护栏损坏检测系统。该系统通过车载摄像头或固定监控采集道路护栏图像,利用改进的YOLOv26算法实现高效准确的损坏检测。系统采用分层架构设计,包含数据采集、检测处理、分析评估和应用服务四个层次,能够自动识别变形、断裂、缺失等五种常见损坏类型,并评估损坏严重程度。相比传统人工检测方法,该系统大幅提高了检测效率和准确性,降低了人工成本和安全风险。关键技术包括多尺度特征融合、注意力机制和自适应非极大值抑制等创新设计,使系统在复杂道路环境下仍能保持稳定的检测性能。

一键难忘的博客 327

利用Messenger跨进程通信

在进行跨进程通信的时候,可能很多开发者一开始想到的就是AIDL。AIDL,中文名称是android接口描述语言,是android系统中用于进行跨进程通信必须了解的。至于如何生成远程对象进行AIDL通信,大家可以看我之前写的一篇文章------对Binder的浅显分析及AIDL的使用。但其实,如果我们进行的跨进程通信逻辑比较简单,我们完全没必要自己生成AIDL,因为android已经为开发者封装了一

HyHarden的博客 3965

【OpenClaw从入门到精通】第63篇:A股智能分析实战——用OpenClaw搭建个人量化研究助手(2026实测版)

2026年,OpenClaw已成为量化投研圈的现象级工具,八家头部券商密集发布专题研报力证其价值。传统量化投研面临技术门槛高、重复劳动多、策略迭代慢、非结构化数据处理弱四大痛点,而OpenClaw通过“AI智能体+金融Skill+量化API”的融合,实现了从数据获取、策略生成、回测验证到持仓监控的全流程自动化。本文基于2026年最新实测经验,完整呈现个人量化研究助手搭建:从阿里云部署、阿里云百炼API配置(含解析失败解决方案)、Tushare数据源接入,到PB-ROE价值选股、研报复现、自动化回测、持仓监控

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1058

Android跨进程通信(三):Messenger使用教程

前面的文章讲述了如何通过AIDL来实现Android的跨进程通信,本篇文章来讲解如何使用Messenger来实现同样的功能。 介绍 Messenger是AIDL的封装,进程可以通过Messenger来实现通信。直接编写AIDL相当复杂,而Messenger大大简化了编写流程。 下面先介绍Messenger的基本使用方法。 准备工作 创建Messenger对象需要传入一个Handler,在这个Handler里对接收到的数据进行处理。 Handler handler = new Handler(){ @Ove

PYJTLK的博客 3294

随机森林遥感反演详细教程

通过这篇文章,我们展示了如何使用Python对筛选后的影响因子进行随机森林建模,并应用于遥感数据反演森林生物量的任务。该流程不仅可以提高预测精度,还能有效处理大规模的遥感数据,为生态监测和森林管理提供重要支持。

热爱分享,热爱记录 2951

DTI-ALPS处理笔记

前段时间刚好学习了一下DTI-ALPS处理(diffusion tensor image analysis along the perivascular space ),记录一下,以便后续学习。ALPS是2017年发表在《Japanese Journal of Radiology》的一篇文章首次提出的 (),主要用于无创评估脑内淋巴系统功能的衡量数值。C图和D图中的蓝色部分是投射纤维,绿色部分是联合纤维,红色部分是皮下纤维。

weixin_52073820的博客 4788

安卓进阶——跨进程通信

本文介绍了Android平台四种主要的跨进程通信方式: AIDL:通过定义接口实现Binder通信,支持同步/异步调用和Parcelable数据传输,适用于复杂IPC场景; Socket:基于TCP/IP的通用通信方案,需手动处理线程和JSON序列化,适合网络或非Android环境通信; Binder:Android核心IPC机制,通过内存映射实现高效数据传输,结合AIDL简化开发,系统服务广泛采用; Messenger:基于消息队列的轻量级Binder封装,支持单向/双向通信,简化Handler式开...

Meteors.的博客 1310

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Android IPC通信机制详解:Binder、AIDL、Messenger实战应用指南 [特殊字符]

Android进程间通信(IPC)是Android开发中的核心技术之一,它允许多个应用进程之间高效、安全地交换数据。在Android系统中,Binder、AIDL和Messenger是三种最重要的IPC通信机制,掌握它们对于构建高性能、稳定的Android应用至关重要。本文将详细介绍这三种核心通信方式的原理、使用场景和实战应用,帮助你快速掌握Android IPC通信的精髓。 ## 📊 And

gitblog_01075的博客 980

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android 进程间通信——Service、Messenger

转载请注明出处:http://blog.youkuaiyun.com/vnanyesheshou/article/details/74198534 Android四大组件(二)Service 接着上一篇Service基础知识,这一篇主要说下介绍下绑定的服务端的三种方式:同一进程绑定服务、跨进程绑定服务(Messenger)、跨进程绑定服务(aidl)。 重点说一下通过Messenger、Service实

奋斗的菜鸟ing 3826

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android跨进程通信AIDL

进程间通过内核提供的机制完成数据交换,称之为进程间通信(IPC,Inter Process Communication)

qq_44054791的博客 693

android跨进程获取对象,Android跨进程通信 Messenger和AIDL实现

Android跨进程通信的方式也是比较多的,项目中用的比较多的应该是Messenger和AIDL,主要讲一下两者的实现跨进程通信的方式1、四大组件间传递Bundle;2、文件共享,多进程读写一个相同的文件,获取文件内容进行交互;3、Messenger,利用Handler实现。(适用于多进程、单线程,不需要考虑线程安全),其底层基于AIDL。4、AIDL(Android Interface Defi...

weixin_35930535的博客 563
上一篇: 安卓异步通信:Handler源码分析
下一篇: 硬链接、软连接浅析
魔幻音
博客等级 码龄6年 16粉丝 202原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

魔幻音

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值