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. 常用的winform属性和工具箱工具

    WinForm: 客户端程序制作 - C/S B/S(外部端,网页端) 不是必须在windows系统上才能运行是在.NET Framework框架上运行  ,在苹果系统上有框架照样可以运行 常用窗体属 ...

  2. WinForm菜单和工具栏

    菜单和工具栏: 1.MenuStrip - 顶部菜单栏分割线:1输入- 2.右键插入 |SpearTOR 快捷键设置:每一个项右键属性的最下面可以设置快捷键不管选项隐藏还是菜单隐藏,快捷键都管用 2. ...

  3. Expression<Func<TObject, bool>>与Func<TObject, bool>的区别

    Func<TObject, bool>是委托(delegate) Expression<Func<TObject, bool>>是表达式 Expression编译后 ...

  4. Internet 信息服务承载说明

    若要运行由 Internet 信息服务 (IIS) 承载的示例,必须确保 IIS 已正确安装且正在运行. 在 Windows Server 2008 R2 上安装 IIS 7.5 版 在"服 ...

  5. jquery简单原则器(匹配除了指定选择器之外的元素 selector 表示选择器)

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

  6. Sublime搭建Python开发环境

    print ('hello world!') 1. 下载python,并设置path系统环境变量:当在命令行中输入python,出现如下界面,显示安装成功. 2. 安装最新的sublime,使用注册机 ...

  7. Linux下安装mongodb详细过程

    本次安装mongodb使用yum.repo方式.详细过程请参考,也列出一些安装过程中的错误,欢迎指正. mongodb版本:3.0 先在linux下cd 到 /etc/yum.repos.d/ 新建脚 ...

  8. Django messages框架

    一.简介 在网页应用中,你经常需要在处理完表单或其它类型的用户输入后,显示一个通知消息(也叫做“flash message”)给用户 对于这个功能,Django 提供基于Cookie 和会话的消息,无 ...

  9. css3中的前缀

    css3中: -o-:opera -moz:firefox -webkit:safari chrome -ms:IE9

  10. 高性能javascript学习笔记系列(3) -DOM编程

    参考 高性能javascript 文档对象模型(DOM)是独立于语言的,用于操作XML和HTML文档的程序接口API,在浏览器中主要通过DOM提供的API与HTML进行交互,浏览器通常会把DOM和ja ...