Messenger:两个进程通过Messenger传递消息,进程1和进程2中都需要创建一个Messenger,创建过程:首先进程2需要创建一个服务,

并在服务中创建一个Messenger对象,进程1通过绑定进程2的服务,在绑定服务时进程2通过Messenger返回一个IBinder对象,

进程1通过绑定服务后返回的IBinder对象,创建一个进程1的Messenger对象这样就和进程2建立联系,就可以通过Messenger进行消息传递

服务端:
1、在服务中创建一个Messenger,用于向客户端发送消息;
2、服务端服务在被绑定时通过Messenger获取IBinder对象并返回,这时就和客户端建立了联系。
3、客户端发送消息后,在服务端的Handler回调中的,可通过msg.reply方法获取客户端传递过来的messenger,

然后创建messge,加入messenger中,并由messenger传递给客户端

客户端:
1、首先绑定服务端的服务,服务端通过创建Messenger,从Messenger中获取客户端需要的IBinder对象并返回,

客户端根据服务端返回的IBinder对象,创建客户端的Messenger对象,通过Messenger和服务端建立联系,并进行消息传递;
2、客户端创建一个Message,由Messenger携带并传入服务端

示例代码如下:

首先是服务端代码:

 package com.jiao.myaidl;

 import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException; public class MessengerService extends Service {
public MessengerService() {
} //创建Messenger对象
private final Messenger mMessenger = new Messenger(new ServiceHandler()); //消息回调,处理客户端传递过来的message对象
private class ServiceHandler extends Handler { @Override
public void handleMessage(Message msg) {
super.handleMessage(msg); switch (msg.what) {
case 0: System.out.println("客户端发过来的:" + msg.getData().getString("client"));
Messenger clientMessenger = msg.replyTo;//获取客户端传过来的Messenger对象
Message replyMessage = Message.obtain();//创建一个返回的message对象
replyMessage.what = 1;
Bundle bundle = new Bundle();
bundle.putString("server_reply", "i come from server");
replyMessage.setData(bundle); try {
//通过客户端传过来的Messenger 将返回数据带回去
clientMessenger.send(replyMessage);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
}
} ; @Override
public IBinder onBind(Intent intent) {
//通过Messenger获取IBinder对象并返回
return mMessenger.getBinder();
} }

在清单文件中注册服务:

    <service android:name="com.jiao.myaidl.MessengerService">
<intent-filter>
<action android:name="com.jiao.myaidl.action.MESSENGER_SERVICE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>

客户端代码:

 package com.jiao.myaidl;

 import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
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.view.View;
import android.widget.Button; import com.jiao.myaidl.client.R; public class MessengerActivity extends AppCompatActivity { private Messenger mMessenger; private class clientHandler extends Handler { @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) { case 1:
String server_reply = msg.getData().getString("server_reply");
System.out.println("服务器返回:" + server_reply);
break;
}
}
} private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mMessenger = new Messenger(service);
System.out.println("绑定服务成功");
} @Override
public void onServiceDisconnected(ComponentName name) { bindService();
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_messenger); bindService(); Button bt = (Button) findViewById(R.id.bt_messenger);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendToService();
}
});
} private void bindService() { Intent it = new Intent();
it.setAction("com.jiao.myaidl.action.MESSENGER_SERVICE");
it.setPackage("com.jiao.myaidl.server");
bindService(it, mConnection, Context.BIND_AUTO_CREATE);
} private void sendToService() {
Message messageClient = Message.obtain(null, 0);
//用于传递给服务端回复的Messenger
Messenger replyMessenger = new Messenger(new clientHandler());
Bundle bundle = new Bundle();
bundle.putString("client", "i come from client");
messageClient.setData(bundle);
//通过Message的replyTo属性将Messenger对象传递到服务端
messageClient.replyTo = replyMessenger;
try {
mMessenger.send(messageClient);
} catch (RemoteException e) {
e.printStackTrace();
}
} }

以上就是两个进程之间通过Messenger实现消息通信;

Android IPC机制之Messenger的更多相关文章

  1. Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用

    在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法.可是我们能发现Messenger是以串行的方式来处理client ...

  2. Android IPC机制全解析<一>

    概要 多进程概念及多进程常见注意事项 IPC基础:Android序列化和Binder 跨进程常见的几种通信方式:Bundle通过Intent传递数据,文件共享,ContentProvider,基于Bi ...

  3. Android IPC机制基础

    概要 多进程概念及多进程常见注意事项 IPC基础:Android序列化和Binder 跨进程常见的几种通信方式:Bundle通过Intent传递数据,文件共享,ContentProvider,基于Bi ...

  4. android IPC 机制 (开发艺术探索)

    一.IPC 机制介绍 IPC是Inter-Process Communication的缩写,含义就是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程.那么什么是进程,什么是线程,进程和线程 ...

  5. Android IPC机制—Binder的工作机制

    进程和线程的关系 IPC机制即为跨进程通信,是inter-Process Communication的缩写.是指两个进程之间进行通信.在说进程通信之前,我们的弄明白什么是线程,什么是进程.进程和线程是 ...

  6. 【Android - IPC】之Messenger简介

    参考资料: 1.<Android开发艺术探索>第二章2.4.3 2.[Messenger完全解析] 1.Messenger概述 Messenger,译为“信使”,是Android中一种基于 ...

  7. 深入理解Android IPC机制之Binder机制

    Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有的进程间通信IPC手段包括(Internet Process Connection): 管道(Pipe).信号(Sign ...

  8. Android IPC机制(二)用Messenger进行进程间通信

    Messenger可以在不同进程中传递Message对象,我们在Message中加入我们想要传的数据就可以在进程间的进行数据传递了.Messenger是一种轻量级的IPC方案并对AIDL 进行了封装, ...

  9. Android IPC机制(五)用Socket实现跨进程聊天程序

    1.Socket简介 Socket也称作“套接字“,是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信.它分为流式套接字和数据包套接 ...

随机推荐

  1. RichTextBoxEx2

    using System;using System.Collections.Specialized;using System.Drawing;using System.Drawing.Imaging; ...

  2. 2013最新版Subversion 1.7.10 for Windows x86 + Apache 2.4.4 x64 安装配置教程+错误解决方案

    一 .工作环境 操作系统:Windows Server 2008 R2 SP1 x64 Apache版本:2.4.4 Subversion版本: Setup-Subversion-1.7.10.msi ...

  3. C# 6.0的字典(Dictionary)的语法

    在C# 6.0,当我们使用Dictionary时,我们可以使用新语法,来去简化程序以提高效率. public Dictionary<string, object> OldToolLocat ...

  4. Java总结篇系列:Java String

    String作为Java中最常用的引用类型,相对来说基本上都比较熟悉,无论在平时的编码过程中还是在笔试面试中,String都很受到青睐,然而,在使用String过程中,又有较多需要注意的细节之处. 1 ...

  5. .Net在线付款---Paypal在线付款开发过程

    原文:.Net在线付款---Paypal在线付款开发过程 最近在做一个Web订单项目,项目有一个需求就是集成Paypal与Paydollar在线付款,一开始看到这个需求也是傻了眼,因为以前从来没有做过 ...

  6. 第二讲:WCF介绍(2)

    代码 https://yunpan.cn/cPns5DkGnRGNs   密码:3913   在上一讲中我们说到 在代码 当中  完成了 服务的寄宿. 这里我们说下 在实际的开发 当中 我们一般不会去 ...

  7. jquery可见性选择器(匹配所有隐藏的元素)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. Python中的编码

    http://liguangming.com/how-to-use-utf-8-with-python http://www.lijiejie.com/python-sys-setdefaultenc ...

  9. linux_shell_4_shell特性

    去年的这个时候,我曾经写过一些关于shell特性的文章,下面是第3篇:linux_shell_3_shell变量特性. 今天我们继续来学习一些关于 Linux shell的内容. [1]shell 在 ...

  10. Java集合源码分析(三)LinkedList

    LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全 ...