Messenger

Messenger,信使,作为进程间通信之一,内部原理是AIDL。
AIDL教程,可以去AIDL传送门了解。

使用

使用Messenger让服务端和客户端进行通信

服务端

  1. 新建服务
    新建MessengerService,继承Service。
public class MessagerService extends Service {public MessagerService() {}
}
  1. 新建Handler,来处理客户端发送的消息
public static final int WHAT_TO_SERVER = 1;
public static final int WHAT_TO_CLIENT = 2;
/*** 服务端handler,用来处理client发来的message*/
private Handler serverHandler = new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(Message msg) {if (null == msg) {return false;}switch (msg.what) {case WHAT_TO_SERVER:System.out.println("Message to client:" + msg.arg1);Messenger client = msg.replyTo;if (null == client) {System.out.println("client null");return false;}Message toClient = Message.obtain(null, WHAT_TO_CLIENT);toClient.arg1 = 101;try {client.send(toClient);} catch (RemoteException e) {e.printStackTrace();}break;default:break;}return false;}
});

通过客户端发送过来的消息Message msg,调用msg.replyto获得客户端的信使Messenger client ,通过client.send(toClient)向客户端回复消息。

  1. 新建信使Messenger,上一步创建的Handler实例作为参数。
/*** 服务端维护的Messenger*/
private Messenger serverMessenger = new Messenger(serverHandler);
  1. 返回Binder
@Override
public IBinder onBind(Intent intent) {// 返回Messenger的IBinderreturn serverMessenger.getBinder();
}

onBind(Intent intent)方法中,返回上一步创建的Messenger.getBinder()

  1. 注册 MessagerService
<serviceandroid:name=".MessagerService"<intent-filter><action android:name="com.jqchen.server.MessagerService"/></intent-filter>
</service>

在注册文件AndroidManifest.xml文件中注册服务,设置action

客户端

  1. 创建Handler用来处理服务端发送的消息
public static final int WHAT_TO_SERVER = 1;
public static final int WHAT_TO_CLIENT = 2;
/*** 处理client接收的消息*/
private Handler clientHandler = new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(Message msg) {if (null == msg) {return false;}switch (msg.what) {case WHAT_TO_CLIENT:System.out.println("Messager from server:" + msg.arg1);break;default:break;}return false;}
});
  1. 创建信使Messenger clientMessager 。
/*** client信使*/
private Messenger clientMessager = new Messenger(clientHandler);
  1. 连接远程服务MessengerService,新建Messenger serverMessenger,用来向服务端发送消息。
/*** server信使*/
private Messenger serverMessenger;
/*** messenger连接*/
private ServiceConnection messagerConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {serverMessenger = new Messenger(service);System.out.println("Messager Service connect");}@Overridepublic void onServiceDisconnected(ComponentName name) {System.out.println("Messager Service disconnect");}
};/*** 绑定远程MessagerService*/
private void messagerConnect() {try {Intent intent = new Intent();intent.setAction("com.jqchen.server.MessagerService");intent.setPackage("com.jqchen.server");bindService(intent, messagerConnection, BIND_AUTO_CREATE);} catch (Exception e) {e.printStackTrace();}
}
  1. 向服务端发送消息
// not connect
if (null == serverMessenger) {System.out.println("未连接");return;
}
// send messager
Message toServer = Message.obtain(null, WHAT_TO_SERVER);
toServer.arg1 = 100;
toServer.replyTo = clientMessager;
try {serverMessenger.send(toServer);
} catch (RemoteException e) {e.printStackTrace();
}

首先新建消息Message toServer ,将toServer.replyTo = clientMessager,这样,对应于服务端接收到此消息,获取到clientMessager,用此clientMessager向客户端回送消息。

Android Messenger使用教程相关推荐

  1. Android WiFi开发教程(三)——WiFi热点数据传输

    在上一篇文章中介绍了WiFi的搜索和连接,如果你还没阅读过,建议先阅读上一篇Android WiFi开发教程(二)--WiFi的搜索和连接.本篇接着简单介绍手机上如何通过WiFi热点进行数据传输. 跟 ...

  2. Android基础新手教程——1.5.2 Git之使用GitHub搭建远程仓库

    Android基础新手教程--1.5.2 Git之使用GitHub搭建远程仓库 标签(空格分隔): Android基础新手教程 本节引言: 在上一节中.我们学习了怎样使用Git.构建我们的本地仓库.轻 ...

  3. android studio控件使用方法,android studio使用教程

    android studio使用教程 Android Studio是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studi ...

  4. Xamarin Android组件篇教程RecylerView动画组件RecylerViewAnimators(1)

    Xamarin Android组件篇教程RecylerView动画组件RecylerViewAnimators(1) RecyclerView是比ListView和GridView更为强大的布局视图, ...

  5. android oppo 权限,OPPO Reno可尝鲜Android Q:教程如下

    原标题:OPPO Reno可尝鲜Android Q:教程如下 5月8日凌晨,Android Q在谷歌I/O开发者大会上正式亮相.在I/O大会现场,谷歌公布了首批Android Q升级名单,其中OPPO ...

  6. [Android Studio 权威教程]Windows下安装Android Studio

    从AS 0.5版本号開始使用.也是AS的推行者,在ApkBus公布的第一篇Android Studio Perview 2 获得了50K的浏览,1800多条回复下载. 在我的[Android Stud ...

  7. Android新手系列教程(申明:来源于网络)

    Android新手系列教程(申明:来源于网络) 地址:http://blog.csdn.net/column/details/androidcoder666.html 转载于:https://www. ...

  8. android,项目,一些教程

    常用的自定义view和第三方类库 Android快速开发框架,MVP架构 Java无框架实现爬取知乎用户信息.图片和知乎推荐内容并下载到本地或数据库中 让接口和文档见鬼去吧!客户端定义服务端返回JSO ...

  9. linux安装 Android Studio详细教程,支持性较差,需要安装最新底层库内核的linux

    安装 Android Studio详细教程 libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 lib32z1 jdk1.8.0_25 android-st ...

最新文章

  1. 安装Macports遇到的问题和PATH设置
  2. LeetCode Self Crossing(判断是否相交)
  3. 今天碰到一道比较有趣的面试题,大家来探讨一下。
  4. office2013安装程序找不到office.zh-cn\officeMUI.xml 最新解决方案
  5. acer switch 10 linux,【AcerSwitch10评测】高颜值的2in1电脑 Acer Switch 10评测_Acer Switch 10_笔记本评测-中关村在线...
  6. Part 1 — Introduction to Smart (legal?) Contracts
  7. python idle怎么用_python的idle如何使用
  8. hive最新UDF函数(2016-10-25)
  9. C语言变长数组 struct中char data[0]的用法
  10. 日志处理(二) 日志组件logback的介绍及配置使用方法(转)
  11. CentOS 6.4 编译安装 gcc-4.8.0
  12. 一个关于文件中位运算的的处理函数。
  13. Object-C-复制
  14. java后台调用SOE时,报异常java.io.IOException: Attempted read from closed stream
  15. 程序员想创业首先要突破自己三关(转)
  16. getchar()细节
  17. python幸运七实验_【python爬虫】原神公测预抽卡活动自动化抽卡脚本
  18. MybatisPlusException: Your property named “xxx“ cannot find the corresponding database column name!
  19. 自动驾驶数据闭环系列之一:理想丰满,现实骨感
  20. Docker 学习笔记(Docker 架构 / 镜像 / 容器 / 常用命令 / Dockerfile / 镜像仓库)

热门文章

  1. 中山大学计算机专硕 学硕,2014年中山大学计算机学硕考研经验
  2. php函数向上取整,php向上取整用什么函数
  3. C++ map中使用pair构造键值对小记
  4. 键盘事件keypress 和 keydown、keyup 的用法与区别
  5. 博奥智源系统安全运维怎么做?
  6. File Zilla服务器回应不可路由的地址。被动模式失败。 -- 解决方案
  7. Android 颜色渐变 属性动画
  8. CSS基础: 单行和多行文本溢出显示省略号
  9. [THUPC2019]鸭棋
  10. 4.3计算机动画制作 教案,制作计算机动画1(2课时)