热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android开发使用Messenger及Handler进行通信的方法示例

这篇文章主要介绍了Android开发使用Messenger及Handler进行通信的方法,结合实例形式分析了Android使用Messenger及Handler定义客户端与服务器端实现通信的相关操作技巧,需要的朋友可以参考下

本文实例讲述了Android开发使用Messenger及Handler进行通信的方法。分享给大家供大家参考,具体如下:

1. 客户端service

public class MessageService extends Service {
 private static final int MSG_SET_VALUE = 0x110;
 private Handler mHandler = new Handler() {
  public void handleMessage(Message msgFromClient) {
   // 返回给客户的信息
   Message msgToClient = Message.obtain(msgFromClient);
   switch (msgFromClient.what) {
   // msg 客户端传来的消息
   case MSG_SET_VALUE:
    try {
     msgToClient.what = MSG_SET_VALUE;
     SystemClock.sleep(2000);
     msgToClient.arg2 = msgFromClient.arg1 + msgFromClient.arg2;
     //msgFromClient.replyTo.send(msgToClient);
     //得到客户端的信使对象,并向它发送消息
     cMessenger = msgFromClient.replyTo;
     cMessenger.send(msgToClient);
    } catch (RemoteException e) {
     e.printStackTrace();
    }
    break;
   default:
    break;
   }
  }
 };
 private Messenger mMessager = new Messenger(mHandler);
 private Messenger cMessenger;
 @Override
 public IBinder onBind(Intent intent) {
  return mMessager.getBinder();
 }
 @Override
 public void onDestroy() {
  cMessenger = null;
  super.onDestroy();
 }
}

2. 服务器端service

public class MessageService extends Service {
 private static final int MSG_SET_VALUE = 0x110;
 private Handler mHandler = new Handler() {
  public void handleMessage(Message msgFromClient) {
   // 返回给客户的信息
   Message msgToClient = Message.obtain(msgFromClient);
   switch (msgFromClient.what) {
   // msg 客户端传来的消息
   case MSG_SET_VALUE:
    try {
     msgToClient.what = MSG_SET_VALUE;
     SystemClock.sleep(2000);
     msgToClient.arg2 = msgFromClient.arg1 + msgFromClient.arg2;
     //msgFromClient.replyTo.send(msgToClient);
     //得到客户端的信使对象,并向它发送消息
     cMessenger = msgFromClient.replyTo;
     cMessenger.send(msgToClient);
    } catch (RemoteException e) {
     e.printStackTrace();
    }
    break;
   default:
    break;
   }
  }
 };
 private Messenger mMessager = new Messenger(mHandler);
 private Messenger cMessenger;
 @Override
 public IBinder onBind(Intent intent) {
  return mMessager.getBinder();
 }
 @Override
 public void onDestroy() {
  cMessenger = null;
  super.onDestroy();
 }
}

3. 客户端使用

public class MainActivity extends Activity {
 private static final int MSG_SET_VALUE = 0x110;
 private TextView mTVStatus; // 连接状态
 private LinearLayout mLLContainer;// 用来添加接收到服务器返回的信息
 private Messenger mService; // 客户端信使
 private boolean isConnecting; // 是否连接
 private Handler mHandler = new Handler() {
  public void handleMessage(Message msgFromServer) {
   switch (msgFromServer.what) {
   case MSG_SET_VALUE:
    TextView tv = (TextView) findViewById(msgFromServer.arg1);
    tv.setText(tv.getText() + "==>" + msgFromServer.arg2);
    break;
   }
   super.handleMessage(msgFromServer);
  };
 };
 private Messenger mMessenger = new Messenger(mHandler);
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  mTVStatus = (TextView) findViewById(R.id.tv_status);
  mLLCOntainer= (LinearLayout) findViewById(R.id.ll_container);
 }
 int i = 0;
 public void send(View view){
  try {
   int a = i++;
   int b = (int) (Math.random() * 100);
   //创建一个tv,添加到LinearLayout中
   TextView tv = new TextView(MainActivity.this);
   tv.setText(a + " + " + b + " = caculating ...");
   tv.setId(a);
   mLLContainer.addView(tv);
   Message msgFromClient = Message.obtain(null, MSG_SET_VALUE, a, b);
   msgFromClient.replyTo = mMessenger;
   if (isConnecting) {
    //往服务端发送消息
    mService.send(msgFromClient);
   }
  } catch (RemoteException e) {
   e.printStackTrace();
  }
 }
 public void bind(View view) {
  Intent service = new Intent();
  service.setAction("android.intent.action.MESSAGE_SERVER");
  bindService(service, conn, Context.BIND_AUTO_CREATE);
 }
 private ServiceConnection cOnn= new ServiceConnection() {
  @Override
  public void onServiceDisconnected(ComponentName name) {
   mService = null;
   isCOnnecting= false;
   mTVStatus.setText("已断开连接!");
  }
  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
   mService = new Messenger(service);
   isCOnnecting= true;
   mTVStatus.setText("连接成功!");
  }
 };
 public void unbind(View view) {
  unbindService(conn);
  cOnn= null;
 }
 @Override
 protected void onDestroy() {
  unbindService(conn);
  cOnn= null;
  super.onDestroy();
 }
}

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android通信方式总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。


推荐阅读
  • 转自:http:malideveloper.arm.comcndevelop-for-malisample-codeetcv1-texture-compression-and-alpha- ... [详细]
  • 这篇文章将为大家详细讲解有关C#开发技巧有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。C#开发技 ... [详细]
  • 北京时间6月21日上午消息,AMD正尝试重新进入服务器处理器市场。该公司将获得微软和百度的帮助。两家公司宣布,将在数据中心中使用AMD最新的Epyc芯片 ... [详细]
  • HTTP请求响应的步骤第一步:第二步:第三步:第四步:第五步第一步:1.客户端连接到Web服务器⼀个HTTP ... [详细]
  • 以下内容|尾部_quarkus实战之一:准备工作
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了quarkus实战之一:准备工作相关的知识,希望对你有一定的参考价值。欢迎访问我的GitHub ... [详细]
  • 通过CreateDirectory命令创建相应的Directory之后,可以将目录的访问权限授予其他用户,这样其他用户就能通过外部表访问很多主机上的文件,而不需要登录到数据库服务器 ... [详细]
  • 泛圈企业云盘:打造高效灵活的协同平台提高企业办公效率
    云计算作为一种新的模式,给企业信息化的发展带来了巨大的变化。其中,企业云盘是一种可以快速被接受的企业云应用,因为在企业云盘存储中,所有云服务带来的风险都会大大降低。将文档管理系统本 ... [详细]
  • IT管理类培训,你想了解的全都在这里
    IT类的培训,主要分为技术类和管理类。不断有小伙伴问起各种培训的价值,内容和对自己职业发展的帮助,希望这篇帖子可以给大家一些启发。首先用 ... [详细]
  • 局限性_Scrum框架的局限性
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Scrum框架的局限性相关的知识,希望对你有一定的参考价值。在很多工作坊的讨论中, ... [详细]
  • 摘要:本文中,我们将进一步理解微服务架构的核心要点和实现原理,为读者的实践提供微服务的设计模式,以期让微服务在读者正在工作的 ... [详细]
  • 事务是通过MULTI命令开始的,在非事务状态下客户端发送的命令会被立刻执行,而在事务状态下,除了EXECWATCHDISCARD这几个命令外,redis会将命令保留在事务队列里。 ... [详细]
  •   uni-app开发教程,uni-app实例教程  UNI-APP开发(仿饿)开发课程:进入学习  推荐(免费):uni-app开发教程  文章目录  简介,网 ... [详细]
  • ApacheTrafficServer6.2.2发布了,TrafficServer是一套快速、模块化 ... [详细]
  • lora物联网开发教程(物联网lora特点)
    长距离星型架构,由于长距离连接性,从而减少了电池寿命。这个协议采用了阿罗哈法。在一个网状网络或者一个异步网络中,例如蜂窝网,结点必须频繁的被唤醒,来同步网络和检查消息。这种同步,大 ... [详细]
  • PHPcURL获取微信公众号access_token的实例php实例:这篇文章主要介绍了PHPcURL获取微信公众号access_token的实例,需要的朋友可以参考下1.开发微信 ... [详细]
author-avatar
sex丶帆布鞋
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有