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
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C#中属性和成员变量的区别说明
2022-02-17 22:36:57
java删除文件和文件夹具体实现
2023-09-26 20:46:55
Java 8 开发的 Mybatis 注解代码生成工具
2023-01-02 19:53:44
![](https://img.aspxhome.com/file/2023/1/66211_0s.png)
c# 通过内存映射实现文件共享内存的示例代码
2023-03-02 12:15:35
java接口返回参数按照请求参数进行排序方式
2023-02-19 07:30:05
![](https://img.aspxhome.com/file/2023/1/64501_0s.png)
Android开发基础简化Toast调用方法详解
2022-02-11 00:44:09
![](https://img.aspxhome.com/file/2023/1/139141_0s.png)
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
![](https://img.aspxhome.com/file/2023/7/101977_0s.png)
C#使用foreach遍历哈希表(hashtable)的方法
2022-10-07 20:00:44
c# 实现控件(ocx)中的事件详解
2022-12-29 04:20:50
![](https://img.aspxhome.com/file/2023/5/88305_0s.jpg)
java interface的两个经典用法
2021-08-17 06:20:56
Java Spring AOP源码解析之事务实现原理
2023-09-10 02:39:46
![](https://img.aspxhome.com/file/2023/5/66945_0s.png)
c#关于JWT跨域身份验证的实现代码
2023-09-12 18:26:02
![](https://img.aspxhome.com/file/2023/7/108927_0s.png)
Java实现添加文字水印&图片水印的方法详解
2023-01-28 08:11:39
![](https://img.aspxhome.com/file/2023/5/110795_0s.png)
Linux系统中C语言编程创建函数fork()执行解析
2023-06-21 01:10:03
![](https://img.aspxhome.com/file/2023/4/105184_0s.png)
基于Tomcat7、Java、WebSocket的服务器推送聊天室实例
2023-11-25 23:35:34
![](https://img.aspxhome.com/file/2023/0/60390_0s.jpg)
Java实现经典游戏复杂迷宫
2021-05-29 22:33:34
![](https://img.aspxhome.com/file/2023/1/63301_0s.png)
Java编程实现高斯模糊和图像的空间卷积详解
2022-06-18 10:44:34
![](https://img.aspxhome.com/file/2023/6/90976_0s.png)