进程间通信---Messenger
来源:互联网 发布:吉他软件手机版 编辑:程序博客网 时间:2024/05/19 21:43
Messenger
概念
可以翻译为信使,通过它可以在不同进程中传递消息(Message)对象,在Message中放入需要传递的数据,就可以实现数据的进程间传递。Messenger是一种轻量级的IPC(进程间通信)方案,它的底层实现是AIDL,看一下Messenger的构造方法,能明显看到有AIDL的痕迹。如下:
public Messenger(Handler target) { throw new RuntimeException("Stub!"); } public Messenger(IBinder target) { throw new RuntimeException("Stub!"); }
作用
实现进程间的通信。
用法
客户端:
public class MainActivity extends Activity { private static final String TAG="MainActivity"; private Messenger mService;//(服务端信使) //用于接受服务端消息的信使(客户端信使) private Messenger mGetReplayMessenger= new Messenger(new MessengerHandler()); private static class MessengerHandler extends Handler{ @Override public void handleMessage(Message msg) { switch (msg.what){ case Constants.MSG_FROM_SERVICE: Log.d(TAG,"客户端收到来自服务端的消息=== "+msg.getData().getString("replay")); break; default: break; } super.handleMessage(msg); } } private ServiceConnection conn=new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //实例化服务端信使 mService=new Messenger(service); Log.d(TAG,"bind service"); //第二个参数what,可以表明是来自客户端 Message msg = Message.obtain(null, Constants.MSG_FROM_CLIENT); Bundle data = new Bundle(); data.putString("msg","客户端:你好,服务端,最近忙吗"); msg.setData(data); //说明来自客户端 //注意这里,把`Activity`的`Messenger`赋值给了`message`中,当然可能你已经发现这个就是`Service`中我们调用的`msg.replyTo`了。 msg.replyTo=mGetReplayMessenger; try { //服务短信使发送 mService.send(msg); }catch (Exception e){ e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { } };/*** 服务一旦绑定成功,客户端先发送一个消息,服务端回复一个消息* */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent("com.ljt.messenger.messengerservice"); bindService(intent,conn, Context.BIND_AUTO_CREATE); } @Override protected void onDestroy() { //传conn对象 实质是只是与服务解绑,服务并没有销毁。 unbindService(conn); super.onDestroy(); }}
服务端:
public class MessengerService extends Service { private static String TAG="MessengerService"; private static class MessengerHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case Constants.MSG_FROM_CLIENT: Log.d(TAG, "服务端收到来自客户端的消息=== " + msg.getData().getString("msg")); //声明一个客户端信使 Messenger client=msg.replyTo; Message replayMessage = Message.obtain(null, Constants.MSG_FROM_SERVICE); Bundle bundle = new Bundle(); bundle.putString("replay","服务端:最近很忙,一直在处理消息"); replayMessage.setData(bundle); try { //用客户端信使传消息 client.send(replayMessage); }catch (RemoteException e){ e.printStackTrace(); } break; default: super.handleMessage(msg); } } }常量:
public class Constants { public static final int MSG_FROM_CLIENT = 0; public static final int MSG_FROM_SERVICE = 1;}
运行结果
代码链接:
https://github.com/HotBloodMan/MessengerDemo
阅读全文
0 0
- 进程间通信----Messenger
- 进程间通信 Messenger
- 进程间通信Messenger
- 进程间通信---Messenger
- Android Messenger 进程间通信
- 进程间通信使用Messenger
- 进程间通信之Messenger
- 进程间通信之messenger
- Android 进程间通信 Messenger
- android进程间通信之Messenger
- Android进程间通信之Messenger
- Android进程间通信(一):Messenger
- Android 进程间通信-Intent、Messenger、AIDL
- Android进程间通信之使用Messenger
- Android使用Messenger实现进程间通信
- 使用Messenger进行进程间通信
- Android进程间通信之Messenger浅析
- Android进程间通信之使用Messenger
- linux文件权限【基本权限ugo】
- 232. Implement Queue using Stacks(java)
- Spring框架中的Quartz使用(详解)
- 杭电acm—1306 String Matching
- Redis学习笔记(三)Redis源码解读
- 进程间通信---Messenger
- hdu 2509 Be the Winner
- 多文本显示省略号
- 初学Hibernate学习1 基础知识掌握
- 1002. 写出这个数 (20)
- 【Linux】Netfilter的使用和实现
- Tensorflow学习笔记(1)-Helloworld
- java中堆栈内存分析(String)
- Poj 1383--Labyrinth【树的直径】【bfs】