所谓的信使就是Messenger,它的作用是建立不同应用之间客户端和服务端的连接,并进而实现信息的传递。

对于服务端信使的创建:

①创建一个Handler对象handler

②创建一个信使对象Messenger messenger = new  Messenger(handler);

③在onBind方法中通过调用messenger对象的getBinder()方法返回一个IBinder对象

④注册服务并添加Action

接下来是在第二个Android项目中获取服务端中创建的信使,并通过该信使给服务端发送消息。

好了,下面我们看代码吧。

第一个项目中的MyService:

package com.example.text05;import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Messenger;
import android.util.Log;public class MyService extends Service {// 创建Handler对象private Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {//获取Message中的值int number = msg.arg1;Bundle bundle = msg.getData();String info = bundle.getString("info");Log.i("main", number + "--->" + info);};};// 创建一个信使对象Messenger messenger = new Messenger(handler);@Overridepublic IBinder onBind(Intent intent) {return messenger.getBinder();}}

在清单文件中注册:

<service android:name="com.example.text05.MyService" ><intent-filter><action android:name="com.example.messenger" /></intent-filter></service>

在第二个MainActivity中的实现:

package com.example.text06;import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.util.Log;
import android.view.View;public class MainActivity extends Activity {private MyServiceConn conn;//创建信使对象用来接受服务端返回的Bind对象private Messenger messenger;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);conn = new MyServiceConn();// 声明IntentIntent intent = new Intent("com.example.messenger");// 绑定服务boolean flag = bindService(intent, conn, BIND_AUTO_CREATE);Log.i("main", "绑定是否成功" + flag);}class MyServiceConn implements ServiceConnection {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// 服务端:IBinder binder = messenger.getBinder();// 能不能通过参数service创建一个Messenger对象messenger = new Messenger(service);}@Overridepublic void onServiceDisconnected(ComponentName name) {}}public void send(View view) {//声明一个Message消息对象Message msg = Message.obtain();msg.arg1 = 100;//这里是不能直接传字符串的,因为字符串String实现的是Serializable接口而不是Parcelable接口//所以会出现异常,因为信使中如果传递对象则必须实现Parcelable接口,如果必须传递字符串考虑使用Bundle
//      msg.obj = "你好,我来自客户端";Bundle bundle = new Bundle();bundle.putString("info", "你好,我来自客户端");msg.setData(bundle);try {//通过信使传递消息messenger.send(msg);} catch (RemoteException e) {e.printStackTrace();}}}

运行结果:这里是通过点击客户端给服务端发送消息,下面是Log输出

Android服务之信使相关推荐

  1. Android服务二 创建绑定服务

    若对AIDL感兴趣,请参考跨进程通信二 AIDL 绑定服务 Ibinder实现绑定服务 功能:主要为了实现组件与服务的交互,在绑定的组件可以调用服务端的功能函数 package service;imp ...

  2. 《Android 应用案例开发大全(第二版)》——6.1节Android系统的信使:Intent

    本节书摘来自异步社区<Android 应用案例开发大全(第二版)>一书中的第6章,第6.1节Android系统的信使:Intent ,作者李宁,更多章节内容可以访问云栖社区"异步 ...

  3. android从服务端获取json解析显示在客户端上面,Android服务端获取json解析显示在客户端上面.doc...

    Android服务端获取json解析显示在客户端上面 Android从服务端获取json解析显示在客户端上面 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比 ...

  4. erlang-百度云推送Android服务端功能实现-erlang

    百度云推送官方地址http://developer.baidu.com/wiki/index.php?title=docs/cplat/push 简单的介绍下原理: 百度云推送支持IOS和Androi ...

  5. Android服务一 创建启动服务

    若要学习创建绑定服务,请查看下篇Android服务二 创建绑定服务 启动服务 基于Service package service;import android.app.Service; import ...

  6. Qt创建Android服务

    Qt创建Android服务 创建Android服务 创建Android服务 从Qt 5.7开始,您可以使用Qt创建Android服务.服务是在后台运行的组件,因此它没有用户界面.执行长期操作(例如记录 ...

  7. Android 服务入门

    前言:硬着头皮把数据库SQLite看完了,接下来就是android服务了,因为自己本身就是菜鸟,所以呢,也只是做做笔记,技术上的东西就别指望我了. 1.什么是服务呢?举个例子,百度地图,美团外卖,OF ...

  8. android.os.binderproxy cannot be cast to,Android服务android.os.BinderProxy错误

    我一直在尝试使此android服务正常工作,但我不知道为什么会收到此错误. 05-13 12:13:36.203: ERROR/dalvikvm(7782): could not disable co ...

  9. android 服务自动结束,Android服务自动停止

    我正在制作一个带有闹钟功能的应用程序.我正在使用这种服务,不断检查设备的当前时间与我的数据库中的时间.Android服务自动停止 我的问题是,如果应用程序从后台删除或设备是rebooted,此serv ...

最新文章

  1. 牛客网数据开发题库_练习SQL利器,牛客网SQL实战题库
  2. 逐步转向自己主动化測试
  3. 有关转换流中涉及的【乱码问题】
  4. 用Android访问本地站点---(localhost,10.0.2.2)要区别
  5. 使用spring @Scheduled注解执行定时任务
  6. 2017第二届中国信息通信大数据大会将于6月在京召开
  7. android SQLite使用SQLiteOpenHelper类对数据库进行操作
  8. 11.go 环境变量
  9. 从计算、建模到回测:因子挖掘的最佳实践
  10. Ubuntu 18.04 开机开启小键盘数字键numlock灯
  11. 使用QtCharts报错
  12. 249PHP等于多少钱,一百万新台币等于多少人民币
  13. 数据是美丽的:11个可视化案例分享
  14. Mysql横向分组统计
  15. Visual Saliency Transformer 读后感
  16. 你可能不知道的GDB命令
  17. matplotlib·2(绘制饼图,直方图,极坐标图,复杂子区域分割)
  18. 如何设计一个通用的查询接口
  19. spring boot在启动程序之前执行逻辑
  20. 在Arcgis地图上绘制Echarts热力图(Heatmap)

热门文章

  1. 显示页面计算机回收站,电脑回收站清空了怎么恢复真的很简单
  2. console.log()和console.dir()的区别
  3. Spring Boot入门教程(五十四): ETL kettle
  4. YATE内部的消息机制
  5. odoo出现menuitem报错
  6. 东芝笔记本一键恢复系统
  7. css中margin属性值百分比的使用
  8. Python画二维图和三维图
  9. 虞小约Java之旅第三天(Java中的运算符)
  10. Python 学习之路(中)