之前看了一篇,然后不自己动手肯定是不行的,然后自己又写了一遍。

背景:

一般使用messenger进行进程间通信的时候,我们只能进行单方向通信。但是有没有办法让服务器端和客户端进行双向通信呢?

解决思路:

在第一次消息交互的时候,将客户端的消息队列作为一个对象传给服务端,让服务端取到客户端的消息队列。这样就可以实现双向通信了。

代码如下:

需要注意的是,远程绑定service的地方,需要加上包名,不要忘记。

重点关注红色部分,其余的地方没有什么好说的啦。

服务端代码

 package com.example.xxx.server_testmsger;

 import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
 package com.example.xxx.server_testmsger;

 import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log; public class serverService extends Service {
private static final int MSG_WHAT = 1;
private static final int REQUEST_KEYEVENT = 1;
private static final int MSG_TOCLIENT = 2;
private static final int REQUEST_KEYEVENT_TOCLIENT = 2;
private Messenger mMessenger_from_client = null; public serverService() {
} private Messenger mMessager = new Messenger(new Handler() {
@Override
public void handleMessage(Message msg) {
Log.d("Server MSG", "handleMessage()");
super.handleMessage(msg); mMessenger_from_client = (Messenger)msg.obj;
Message message = msg.obtain(msg);
Log.d("Server MSG", message.toString());
switch (message.what) {
case MSG_WHAT:
Message msgToClient = new Message();
msgToClient.what=MSG_TOCLIENT;
msgToClient.arg1=REQUEST_KEYEVENT_TOCLIENT;
try {
Log.d("Server MSG", "sending message....");
mMessenger_from_client.send(msgToClient);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
break;
}
} }); @Override
public IBinder onBind(Intent intent) {
return mMessager.getBinder();
}
}

客户端代码

 package com.example.xxx.client_testmsger;

 import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextThemeWrapper;
import android.view.View;
import android.widget.Button; import java.io.InputStream; public class MainActivity extends AppCompatActivity {
private Messenger mMessenger = null;
private Messenger mServiceMessenger = null;
private Intent serviceIntent;
private static final int MSG_WHAT = 1;
private static final int REQUEST_KEYEVENT = 1;
private static final int MSG_TOCLIENT = 2;
private static final int REQUEST_KEYEVENT_TOCLIENT = 2; private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_TOCLIENT:
Log.e("Client MSG","got Message from server");
Log.e("Client MSG",msg.toString());
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); serviceIntent = new Intent();
serviceIntent.setComponent(new ComponentName("com.example.xxx.server_testmsger","com.example.xxx.server_testmsger.serverService"));
bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE);
mMessenger = new Messenger(mHandler);
} private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e("MSG","MainActivity Start");
Log.d("Client MSG", "onServiceConnected()");
if (service == null) {
mServiceMessenger = null;
} else {
mServiceMessenger = new Messenger(service);
Message message = new Message();
message.what = MSG_WHAT;
message.arg1 = REQUEST_KEYEVENT;
message.obj = mMessenger;
try {
Log.d("Client MSG", "Message send()");
mServiceMessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
} @Override
public void onServiceDisconnected(ComponentName name) {
Log.d("Client MSG", "onServiceDisconnected()");
mServiceMessenger = null;
}
}; @Override
public void onDestroy() {
super.onDestroy();
unbindService(mConnection);
}
}

Android - 使用messager实现进程间通信(服务器端→客户端,客户端→服务器端双向)的更多相关文章

  1. Android客户端和服务器端数据交互

    网上有很多例子来演示Android客户端和服务器端数据如何实现交互不过这些例子大多比较繁杂,对于初学者来说这是不利的,现在介绍几种代码简单.逻辑清晰的交互例子,本篇博客介绍第四种: 一.服务器端: 代 ...

  2. 【转】Android Https服务器端和客户端简单实例

    转载地址:http://blog.csdn.net/gf771115/article/details/7827233 AndroidHttps服务器端和客户端简单实例 工具介绍 Eclipse3.7 ...

  3. android客户端从服务器端获取json数据并解析的实现代码

    今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下   首先客户端从服务器端获取json数据 1.利用HttpUrlConnection /** * 从指定的U ...

  4. (转)android客户端从服务器端获取json数据并解析的实现代码

    今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下       首先客户端从服务器端获取json数据 1.利用HttpUrlConnection   复制代码 ...

  5. android客户端从服务器端获取json数据并解析的实现代码(重要)

    首先客户端从服务器端获取json数据 1.利用HttpUrlConnection /** * 从指定的URL中获取数组 * @param urlPath * @return * @throws Exc ...

  6. Android客户端与服务器端通过DES加密认证

    转载地址:http://blog.csdn.net/spring21st/article/details/6730283 由于Android应用没有像web开发中的session机制,所以采用PHPS ...

  7. android客户端向服务器端验证登陆方法的实现2

    一.在上一篇文章中,我只是提到了其中一种方法来实现登陆 大家可以参见: http://www.apkbus.com/android-45004-1-1.html      android获取web服务 ...

  8. zookeeper原理解析-客户端与服务器端交互

    Zookeeper集群中server数量总是确定的,所以集群中的server交互采用比较可靠的bio长连接模型:不同于集群中sever间交互zookeeper客户端其实数量是未知的,为了提高zooke ...

  9. ASP.NET获取客户端、服务器端的信息

    ASP.NET获取客户端.服务器端基础信息 1. 在ASP.NET中专用属性: 获取服务器电脑名:Page.Server.ManchineName 获取用户信息:Page.User 获取客户端电脑名: ...

随机推荐

  1. MMU介绍【转】

    转自:http://blog.csdn.net/martree/article/details/3321578 虚拟存储器的基本思想是程序,数据,堆栈的总的大小可以超过物理存储器的大小,操作系统把当前 ...

  2. 转载:html+js实现只允许输入两位小数的输入框

    JS代码: <script language="JavaScript" type="text/javascript"> function clear ...

  3. Linux系统日常运维-修改IP地址

    分享下高手写的很好的文章 IP地址.子网掩码.网络号.主机号.网络地址.主机地址 step 0: check the iptables.selinux service iptables iptable ...

  4. Eclipse4.4以上版本不能使用easyExplorer,采用OpenExplorer

    如果想在Ecipse里打开目录,一直用easyExplorer,可是现在版本升级了easyExplorer不好使,可以用OpenExplorer到https://github.com/samsonw/ ...

  5. [Cocoa]深入浅出Cocoa多线程编程之 block 与 dispatch quene

    深入浅出 Cocoa 多线程编程之 block 与 dispatch quene 罗朝辉(http://www.cppblog.com/kesalin CC 许可,转载请注明出处 block 是 Ap ...

  6. 【redis】redis实现API接口调用调用次数的限制

    redis实现API接口调用调用次数的限制 参考地址:https://bbs.csdn.net/topics/391856106?page=1 参考地址:https://www.cnblogs.com ...

  7. Android开发初期之后怎么提升?怎么才能叫精通?方向在哪?

    hi大头鬼hi Android开发专家     先mark一下,好多人我发现始终停留在两三年的水平上没有突破. 另外还有一个误区就是越底层越牛逼 第三个就是,我认识的大部分所谓的做过rom开发的对fr ...

  8. HDU4004

    题目大意,有一条长度为L和河流,中间穿插n个石凳,青蛙跳m次经过石凳后到达对岸,求青蛙每次跳跃的最大距离的最小值 本题数据量大n<500000,显然简单的o(n*n)算法是通过不了的,在输入大量 ...

  9. OpenCV头文件包含问题

    opencv从2.2版本以后<opencv root>include下有两个文件夹 opencv 和opencv2.从官方的意思来看,它逐渐喜欢用opencv2里面的那种包含头文件的方式. ...

  10. 【前端阅读】——《JavaScript入门经典》摘记之JavaScript与XML

    前言:这本书除了基础的JavaScript理论体系之外,有一个特别的章节,就是讲解——JavaScript与XML的关系,从中,我更进一步的了解了XML的基础.创建.显示以及使用JavaScript如 ...