Android开发使用Messenger及Handler进行通信的方法示例
作者:LovooGod 发布时间:2022-02-23 23:35:22
标签: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程序设计有所帮助。
来源:http://blog.csdn.net/lovoo/article/details/51192632


猜你喜欢
- 需求winForm 程序输出类型为 windows 程序(不是命令行程序)在运行时想输入一些信息编译开发调试,如何实现这一功能解答:Allo
- C#Windows server2016服务器搭建NFS共享文件夹与C#上传图片到共享文件夹nfs共享文件夹实现步骤基于:Windows s
- 本文实例讲述了Java矩阵连乘问题(动态规划)算法。分享给大家供大家参考,具体如下:问题描述:给定n个矩阵:A1,A2,...,An,其中A
- 本文实例为大家分享了Android判断网络状态的具体代码,供大家参考,具体内容如下一、权限需要在AndroidManifest.xml 添加
- 在Java SE中,对IO流与集合的操作在应用中比较重要。接下来,我以一个小型项目的形式,演示IO流、集合等知识点在实践中的运用。该项目名称
- WPF动画效果系列WPF实现动画效果(一)之基本概念WPF实现动画效果(二)之From/To/By 动画WPF实现动画效果(三)之时间线(T
- 先看一段同步代码:public int SumPageSizes(IList<Uri> uris) {
- 本文实例为大家分享了Android多媒体之画画板开发的具体代码,供大家参考,具体内容如下先看看效果:其实画画板的原理很简单,就是首先记录下按
- 本文实例为大家分享了java实现点击按钮事件弹出子窗口的具体代码,供大家参考,具体内容如下要求:1、在父窗口中添加一个按钮2、点击按钮弹出子
- Selenium IDE 是Firefox 浏览器的一个插件, 它会记录你对Firefox的操作,并且可以回放它的操作。 用法简单,不过我觉
- Java 虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途,如图所示:程序计数器程序计数
- 线程池类图我们最常使用的Executors实现创建线程池使用线程主要是用上述类图中提供的类。在上边的类图中,包含了一个Executor框架,
- 本文实例讲述了Android编程实现状态保存的方法。分享给大家供大家参考,具体如下:1、当我们正在发短信的时候,已经写了几百字了,这时突然来
- 引导要求:线程资源必须通过线程池提供,不允许在应用自行显式创建线程;说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开
- Hystrix 是一个帮助解决分布式系统交互时超时处理和容错的类库, 它同样拥有保护系统的能力。Netflix的众多开源项目之一。设计流程:
- 简介目的:Optional的出现主要是为了解决null指针问题,也叫NPE(NullPointerException)外形:Optional
- 单个和批量定义别名typeAliases使用Mybatis的别名typeAliases可以在xml文件里非常方便的使用类,而不需要写出这个类
- 本文实例为大家分享了C#实现多个计时器记录不同定时时间的具体代码,供大家参考,具体内容如下1.定义Timer类、定义委托//定义Timer类
- 前言我们之前讲述的动画都需要主动触发或者是重复执行,那有没有自己触发动画的组件呢?这样我们就可以在 StatelessWidget 里直接使
- 翻译自 John Demetriou 2019年2月17日 的文章 《C# 8 – Introducing Index Struct And