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

作者:LovooGod 时间:2022-02-23 23:35:22 

本文实例讲述了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程序设计有所帮助。

来源:http://blog.csdn.net/lovoo/article/details/51192632

标签:Android,Messenger,Handler
0
投稿

猜你喜欢

  • C#中属性和成员变量的区别说明

    2022-02-17 22:36:57
  • java删除文件和文件夹具体实现

    2023-09-26 20:46:55
  • Java 8 开发的 Mybatis 注解代码生成工具

    2023-01-02 19:53:44
  • c# 通过内存映射实现文件共享内存的示例代码

    2023-03-02 12:15:35
  • java接口返回参数按照请求参数进行排序方式

    2023-02-19 07:30:05
  • Android开发基础简化Toast调用方法详解

    2022-02-11 00:44:09
  • Java8时间接口LocalDateTime详细用法

    2023-11-25 09:56:49
  • ThreadLocal使用案例_动力节点Java学院整理

    2021-06-08 09:57:15
  • Mybatis与Jpa的区别和性能对比总结

    2022-09-17 16:08:45
  • JPA @Basic单表查询如何实现大字段懒加载

    2021-06-03 18:02:00
  • C#使用foreach遍历哈希表(hashtable)的方法

    2022-10-07 20:00:44
  • c# 实现控件(ocx)中的事件详解

    2022-12-29 04:20:50
  • java interface的两个经典用法

    2021-08-17 06:20:56
  • Java Spring AOP源码解析之事务实现原理

    2023-09-10 02:39:46
  • c#关于JWT跨域身份验证的实现代码

    2023-09-12 18:26:02
  • Java实现添加文字水印&图片水印的方法详解

    2023-01-28 08:11:39
  • Linux系统中C语言编程创建函数fork()执行解析

    2023-06-21 01:10:03
  • 基于Tomcat7、Java、WebSocket的服务器推送聊天室实例

    2023-11-25 23:35:34
  • Java实现经典游戏复杂迷宫

    2021-05-29 22:33:34
  • Java编程实现高斯模糊和图像的空间卷积详解

    2022-06-18 10:44:34
  • asp之家 软件编程 m.aspxhome.com