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

背景:

一般使用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);
}
}

最新文章

  1. linux 中压缩记得压缩用c,解压用x
  2. Spring集成jedis支持Redis3.0集群
  3. 某站出品2016织梦CMS进阶教程共12课(附文档+工具)
  4. python 字符串翻转
  5. 重构10-Extract Method(提取方法)
  6. CKEditor配置及使用
  7. 关于《Swift开发指南》背后的那些事
  8. 在O(1)时间删除链表结点
  9. RabbitMQ系列教程之四:路由(Routing)
  10. visual studio各种新建项目和新建项简介
  11. [转载]关于laravel中表关系的一对一、一对多、多对一、多对多实践
  12. Django(框架、模板)
  13. JVM几种垃圾回收器介绍
  14. 关于mybatis反向生成为什么有时候实体类会变成两个
  15. 基于pandas python的美团某商家的评论销售数据分析(可视化)
  16. 怎样在tsung中使用动态參数(二)
  17. 20155335俞昆《java程序设计》第三周总结
  18. hrbust - 2239
  19. log4j配置文件的手动加载与配置初始化
  20. Could..... not preload global game manager

热门文章

  1. C#图片转成流,流转成图片,字节转图片,图片转字节的方法
  2. git的使用学习(七)githup和码云的使用
  3. 二叉树遍历 Morris
  4. Java IO 学习(三)缓冲IO / 直接IO / 内存映射
  5. Wannafly交流赛1 B 硬币[数学思维/贪心]
  6. [深度应用]·Keras实现Self-Attention文本分类(机器如何读懂人心)
  7. Axure基础操作
  8. JMeter性能测试常用之事务控制器实例
  9. Oracle Linux 6.4(BOND)双网卡绑定实战—附加说明
  10. HDU 5360 Hiking(优先队列)