Android 开发艺术探索笔记(5,我的头条面试经历分享

2023-05-16

public Messenger(Handler target){

mTarget = target.getIMessenger();

}

public Messenger(IBinder target){

mTarget = IMessenger.Stub.asInterface(target);

}

得到的mTarget是AIDL类的~ Messenger对AIDL进行了封装,使得我们可以便捷的使用。实现一个Messenger由以下步骤,分为服务端和客户端。

- 服务端进程

在服务端创建一个Service来处理客户端的请求,同时创建一个Handler并通过他来创建一个Messenger对象,然后在Service的onBinder返回这个Messenger对象底层的Binder即可。

- 客户端进程

客户端进程中首先要绑定Service,创建成功后用服务端返回的Binder对象创建一个Messenger,通过这个Messenger就可以向服务端发送消息了,发送的消息类型为Message对象。如果需要服务端回应客户端,则要创建一个Handler并创建一个新的Messenger并把这个Messenger对象通过Message的replyTo参数传递给服务端,服务端通过replyTo就可以回应客户端。

P66展示出一个例子:

- 服务端:

继承Service,创建一个Handler类,里面的handlerMessager()接收来自客户端传来的message,接着在外面new出一个Messenger对象来和刚刚的Handler类相关联,最后在onBinder返回这个Messenger对象的底层binder。接着在Manifest中声明这个service。

- 客户端:

用ServiceConnection和bindService来绑定服务,在ServiceConnection的方法里面得到了服务的binder,用其来创建一个Messenager对象。接着创建一个Message对象来装信息包括setData()放一个Bundle,最后开启try去用Messenager对象去发送这个message。

从上面例子我们看出来在Messenger中进行数据传递必须将数据放在Message中,而Messenger和Message都实现了Parcelable接口。通过Messenger传输的Message载体只有what,arg1,arg2,Bundle以及replyTo。Message的另一个字段object在同一个进程中很实用,但在IPC中,object字段不能接收我们自定义的Pacelable对象。所以实用性大大降低。

之前讲过,服务端可以回应客户端,如果需要服务端在接收到客户端信息之后,给客户端回一句“好的”,可以这样做:

在Service里的Handler对象里,在接受了客户端的信息之后,创建一个Messenger。

Messenger client = msg.replyTo; //msg为客户端传过来的信息。

Message replyMessage = Message.obtain(null,MyConstants.MSG_FROM_SERVICE);

Bundle bundle = new Bundle();

bundle.putString(“reply”,“嗯,好哒!”);

replyMessage.setData(bundle);

try{

client.send(replyMessage);

}…

然后客户端也创建接收消息的Messenger和Handler对象,同时关键的一点是在发送Message的时候要将replyTo参数传给客户端。

msg.replyTo = mGetReplyMessenger; //此Messenger是上刚刚说的接收消息的Messenger对象。

此时查看log,功能已经完成。下图可以便于理解Messenger的工作原理:

![这里写图片描述](https://img-blog.csdn.net/2018070421334014?watermark/2/text/aHR0cHM6Ly9ibG

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

9nLmNzZG4ubmV0L3Jpa2thdGhld29ybGQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

<使用AIDL>

Messenger是以串行的方式来处理客户的消息,如果大量的消息同时发送到服务端则Messenger则不太适用了,同时Messenger的主要作用为传递消息,很多时候我们要跨进程来调用服务端的方法,Messenger就无能为力,所以这个时候我们要使用更加全面的AIDL。

这里先介绍AIDL的IPC,也分为服务端和客户端两个方面。

  1. 服务端

首先创建Service来监听客户端的连接请求,然后创建一个AIDL文件,将暴露给客户端的接口在这个AIDL文件中声明(即映射AIDL),最后在Service中实现这个AIDL接口即可。

  1. 客户端

首先绑定Service,绑定成功后将得到Binder对象转化成AIDL对象,然后就可以调用AIDL中的方法了。

  1. AIDL接口的创建

首先看AIDL接口,我们创建了一个后缀为aidl的文件,在里面声明了一个接口和两个方法。这是一个AIDL的例子,Book为一个实现了Parcelable实体类,IBookManger为AIDL文件。

这里写图片描述

AIDL支持的数据有:

(1)基本数据类型

(2)String和CharSequence

(3)List :只支持ArrayList

(4) Map : 只支持HashMap,key和value都要能被AIDL支持。

(5)Parcelable对象

(6)AIDL

当一个类实现了自定义Parcelable接口的时候必须要去创建和它同名的映射类AIDL。

这里写图片描述

其次,当AIDL除了基本类型,其他类型的参数都需要加上in、out、inout。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 开发艺术探索笔记(5,我的头条面试经历分享 的相关文章

  • MATLAB快速入门(二):矩阵

    矩阵 目录 矩阵 1 冒号表达式 2 矩阵元素的引用 3 矩阵的运算 3 1算术运算 3 2逻辑运算 4 特殊矩阵 5 矩阵变换 5 1对角阵 5 2三角阵 5 3矩阵旋转 5 4稀疏矩阵 6 矩阵求值 1 冒号表达式 e1 e2 e3 省
  • toString方法使用

    一 Object类中toString的作用 1 在主方法中我们可以直接用toString 输出对象其中的内容 2 我们需要直接输出对象中所属内容时 xff0c 直接使用toString 方法输出语句 xff0c 输出内容不友好 xff0c
  • px4+mavros+offboard控制+gazebo仿真以及与pixhawk4飞控连接(一)

    记录一下自己从px4到板载控制的一系列流程以及踩坑过程 xff0c 希望也可以帮助大家避雷 话不多说直接上干货 一 软 硬件平台 px4版本 xff1a 1 10 1 飞控板 xff1a pixhawk4 ros版本 xff1a melod
  • 浅谈穿越机飞控如何烧写固件及其相关设置问题

    背景 xff1a 自己本人是无人机爱好者对穿越机也较为痴迷 xff0c 在使用DJI FPV天空端时发现无法显示OSD信息 xff0c 同时在眼镜端的OSD开关已经打开 xff0c 查阅相关资料发现自己的飞控版本过低需要烧写到4 1 0以上
  • XSS攻击原理及防范

    文章目录 一 XSS攻击简介二 XSS攻击分类1 反射型2 存储型3 DOM based型 三 XSS防范1 cookie安全策略2 X XSS Protection设置3 XSS防御HTML编码4 XSS 防御HTML Attribute
  • Jetson Xavier NX安装librealsense

    在nx上安装librealsense可以使用由jetsonhacks开源的安装脚本installRealSenseSDK 克隆仓库 xff0c 进入目录 git clone https github com jetsonhacks inst
  • Kubernetes(K8s)的简介及基础知识

    1 关于Kubernetes xff08 K8s xff09 的简介 Kubernetes xff0c 简称又叫K8s xff0c 为什么简称要叫K8s xff0c 据说是因为Kubernetes单词中K字母和S字母之间相隔8个字母 xff
  • 爬虫实战(三)

    随着互联网的不断发展 xff0c 网络数据的规模和价值也不断提升 在这个大数据时代 xff0c 如何从海量数据中提取有价值的信息并加以利用 xff0c 成为了数据科学 商业分析 金融预测 社会研究等领域中一个重要的问题 而网络爬虫作为一种数
  • 数据库连接

    一 连接数据库的方法和工具 数据库连接是访问数据库的关键步骤之一 xff0c 通过连接数据库 xff0c 我们可以进行数据的增删改查等操作 下面介绍几种连接数据库的方法和工具 命令行工具 在命令行中输入相应的命令即可连接数据库 常用的命令行
  • C语言之十进制转化为十六进制

    作者 xff1a 从未止步 博客主页 xff1a 从未止步的博客 专栏 xff1a 和我一起学C 语录 xff1a Every day is a second chance 行动是理想最高贵的表达 xff0c 给大家介绍一款超牛的斩获大厂o
  • 合肥工业大学机器人足球仿真robcup作业二(python实现)附代码有注释

    用面向对象的思维设计相关类 xff0c 从而实现直线与直线 直线与圆 直线与矩形的交点 要求各给出每个案例的至少一个示例的程序 这是第二次机器人足球的作业代码 xff0c 写的比较潦草 xff0c 但是用的方法还是通俗易懂的 xff0c 基
  • 合肥工业大学机器人足球仿真robcup作业三(python实现)附代码有注释

    第三次作业 题目 xff1a 已知2个点的信息 定位自己的绝对坐标 设图中C 0 0 P1 52 5 32 P2 52 5 32 P3 52 5 32 P4 52 5 32 P5 0 32 P6 0 32 P7 30 7 P8 30 7 P
  • 程序员一定要知道的10个网站,记得收藏

    为大家整理了对程序员超有用的网站合集 xff0c 今天主要分享知识社区 amp 学习刷题两大类 希望能助力各位早日成为码神 话不多说 xff0c 直接上干货 知识社区类 1 Github 程序员的Facebook 毋庸置疑 xff0c 首位
  • for in 和for of的区别

    文章目录 1 遍历数组通常用for循环2 for in遍历数组3 遍历对象总结 1 遍历数组通常用for循环 ES5的话也可以使用forEach xff0c ES5具有遍历数组功能的还有map filter some every reduc
  • win11打开移动热点显示“我们无法设置移动热点”

    解决方法 xff1a 以下方法是本人联系微软客服解决 xff0c 亲测有效 用管理员模式打开命令提示符 xff0c 输入netsh winsock reset xff08 按下Enter键 xff09 netsh int ip reset
  • 树莓派pico的软件安装及使用

    简介 xff1a 在些日子在芯查查积分商城兑换了一个树莓派pico xff0c 来教大家怎么安装Thonny软件 xff0c 并且使用Thonny编译运行树莓派pico 第一步 xff1a 安装固件 第二步 xff1a 在window上安装
  • Git分布式版本控制工具(linux)

    内容 xff1a Git 概述 Git 代码托管服务 Git 常用命令 在 IDEA 中使用 Git 目录 1 前言 xff1a 1 1 什么是Git xff1f 1 1 1 其他版本控制工具 xff1a 1 2 使用Git能做什么 xff
  • ADRC的simulink仿真实现与m代码实现

    本文章以最简单的二阶系统为例 xff0c 介绍其simulink仿真实现和m代码实现 案例中的二阶系统如下所示 经典ADRC的基本结构如下 xff1a 本案例中的simulink仿真整体结构 xff08 为便于理解 xff0c 结构图与上述
  • 安装ROS

    如何在电脑安装ROS 安装ROS环境是学习ROS的第一步 xff0c 本文将记录个人搭建的过程 xff0c 包括可能遇到的错误 解决办法 个人心得等 文章目录 如何在电脑安装ROS 前言一 在Windows系统下载VMware虚拟机并安装二
  • ROS命令行工具的使用

    一 命令行工具的使用 前言 在ROS里面 xff0c 命令行工具的使用能够使我们深入了解ROS xff0c 使我们操作ROS的时候更加方便 我们利用海龟作为示例进行命令行工具的学习 运行小海龟步骤 xff1a 终端输入 roscore 然后

随机推荐

  • ROS快捷操作键和话题记录与复现

    一 ROS快捷操作键 打开终端 xff1a Ctrl 43 alt 43 T 查看隐藏文件夹 xff1a Ctrl 43 H 结束终端的某个操作 xff1a Ctrl 43 C 启动运行ROS系统前必须的一个指令 xff1a roscore
  • ROS工作空间和功能包

    一 工作空间 工作空间 xff08 workspace xff09 xff08 缩写ws xff09 工作空间是存放工程开发相关文件的文件夹 代码空间 xff08 source space xff09 xff08 src xff09 是用来
  • ROS实现代码及已编译代码运行步骤

    目录 一 实现一个代码步骤1 C 43 43 代码实现步骤2 python代码实现步骤 二 已编译代码运行步骤 一 实现一个代码步骤 1 C 43 43 代码实现步骤 在catkin ws src 内创建功能包的步骤 其实可以任意创建工作空
  • 基于ROS的PX4+Gazebo仿真——PX4一键起飞及飞行控制

    一键起飞 参考及引用 1 CSDN博主 战争果子 的原创文章 xff0c 遵循CC 4 0 BY SA版权协议 原文 xff1a https blog csdn net EnthusiasmZing article details 7916
  • RT-Thread相比较于Freertos的优势在哪里

  • Up Board安装ROS及mavros

    Up Board安装ROS及mavros 目录 Up Board安装ROS及mavros一 在Up Board安装Ubuntu系统1 材料准备2 拿一个空的U盘作为驱动盘为Up Board安装系统3 安装Ubuntu系统 二 在Ubuntu
  • Unity和ROS通讯的机械臂

    Unity和ROS之间的通讯包 目录 Unity和ROS之间的通讯包参考及引用1 Github源码地址 Unity和ROS之间的通讯 一个ROS包 xff08 用于接收从Unity场景发送的ROS消息 xff09 两个导入到Unity的包
  • 虚拟机Ubuntu磁盘扩容个人记录

    虚拟机Ubuntu磁盘扩容个人记录 一 修改扩展大小 修改成功以后 xff0c 打开虚拟机Ubuntu 二 进入Ubuntu修改 打开终端 xff0c 输入 sudo gparted 右键点击后更改大小 然后确定修改 最后 xff0c 终端
  • 下载源码包后在Ubuntu编译

    下载源码包后在Ubuntu编译 学习使用Ubuntu过程中 xff0c 不免会尝试跑一遍别人的代码 xff0c 这时候要知道如何将源码下载后进行编译及运行 本文与以下两篇博客相关 xff1a ROS工作空间和功能包 ROS实现代码及已编译代
  • 利用科大讯飞语音合成模块SDK实现ROS语音交互

    利用科大讯飞语音合成模块SDK实现ROS语音交互 本文内容与CSDN博主 AI Chen 的原创文章相同 xff0c 可以直接参考原文 xff1a https blog csdn net qq 39400324 article detail
  • tts_subscribe.cpp代码

    tts subscribe cpp span class token comment 语音合成 xff08 Text To Speech xff0c TTS xff09 技术能够自动将任意文字实时转换为连续的 自然语音 xff0c 是一种能
  • FreeRTOS线程安全、中断安全的printf实现方式

    文章目录 前言一 问题描述二 解决方案1 线程安全 中断安全的printf实现方式 总结参考 前言 利用串口对基于FreeRTOS的多任务程序调试过程中 xff0c 时常出现数据交叉打印 xff0c 甚至出现乱码现象 这是因为通常情况下 x
  • 结构体空间对齐和结构体数组的使用

    今天在学习linux的platform总线时 xff0c 设备对资源的描述用到了结构体数组 xff0c 以前从没见过 如下 很明显用结构体数组主要是用来给一系列相同类型的结构体赋值 xff0c 主要是来看内存分配问题 首先是结构体的内存分配
  • ubuntu:出现bash: /opt/ros/melodic/setup.bash: 没有那个文件或目录 解决方法

    如图 xff0c 解决方法如下 xff1a 打开虚拟机终端 xff0c 输入 gedit bashrc 弹出一个文件 xff0c 找到最后一行 xff0c 如图所示 然后我roscore了一下 xff0c 看了一下我的ros版本 xff1a
  • STC单片机仿三菱FX2n方案 hex烧录进去就可以当plc用

    STC单片机仿三菱FX2n方案 hex烧录进去就可以当plc用 xff0c 成本低方便快捷id 61 643520282241 amp
  • 西门子S7-1200系列PLC定时器指令

    定时器指令是在PLC程序设计中非常常见的一种指令 xff0c S7 1200系列PLC的定时器的指令格式及使用方式都不同于S7 200系列PLC S7 1200系列PLC的采用的是IEC标准的定时器指令 xff0c 用户程序中可以使用的定时
  • 0基础学springboot之对数据库的增删改查

    1 xff1a 使用的是mysql数据库 xff0c 数据库中的表为student 2 xff1a 创建springboot项目 xff0c 在pom文件里加载mysql依赖 lt dependency gt lt groupId gt m
  • 平衡车Car_Balance(一)——电机

    目录 一 电机简要概述 二 常见电机种类 1 直流有刷电机 xff08 BDC xff0c 最最最常见的电机 xff09 2 直流无刷电机 xff08 BLDC xff09 3 舵机 4 步进电机 三 平衡小车选用电机及需要关注的参数 1
  • 用matlab进行xlsx表格的提取和操作

    用matlab进行xlsx表格的提取和操作 一 数据的提取二 垃圾数据的清除三 数据的分类四 图像的绘制 在学习数学建模时 xff0c 我们会碰到大数据的问题 xff0c 这类问题通常要进行数据预处理 xff0c 这是我用matlab进行预
  • Android 开发艺术探索笔记(5,我的头条面试经历分享

    public Messenger Handler target mTarget 61 target getIMessenger public Messenger IBinder target mTarget 61 IMessenger St