Android IPC机制之Messenger
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的更多相关文章
- Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用
在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法.可是我们能发现Messenger是以串行的方式来处理client ...
- Android IPC机制全解析<一>
概要 多进程概念及多进程常见注意事项 IPC基础:Android序列化和Binder 跨进程常见的几种通信方式:Bundle通过Intent传递数据,文件共享,ContentProvider,基于Bi ...
- Android IPC机制基础
概要 多进程概念及多进程常见注意事项 IPC基础:Android序列化和Binder 跨进程常见的几种通信方式:Bundle通过Intent传递数据,文件共享,ContentProvider,基于Bi ...
- android IPC 机制 (开发艺术探索)
一.IPC 机制介绍 IPC是Inter-Process Communication的缩写,含义就是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程.那么什么是进程,什么是线程,进程和线程 ...
- Android IPC机制—Binder的工作机制
进程和线程的关系 IPC机制即为跨进程通信,是inter-Process Communication的缩写.是指两个进程之间进行通信.在说进程通信之前,我们的弄明白什么是线程,什么是进程.进程和线程是 ...
- 【Android - IPC】之Messenger简介
参考资料: 1.<Android开发艺术探索>第二章2.4.3 2.[Messenger完全解析] 1.Messenger概述 Messenger,译为“信使”,是Android中一种基于 ...
- 深入理解Android IPC机制之Binder机制
Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有的进程间通信IPC手段包括(Internet Process Connection): 管道(Pipe).信号(Sign ...
- Android IPC机制(二)用Messenger进行进程间通信
Messenger可以在不同进程中传递Message对象,我们在Message中加入我们想要传的数据就可以在进程间的进行数据传递了.Messenger是一种轻量级的IPC方案并对AIDL 进行了封装, ...
- Android IPC机制(五)用Socket实现跨进程聊天程序
1.Socket简介 Socket也称作“套接字“,是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信.它分为流式套接字和数据包套接 ...
随机推荐
- C#项目””是针对”.NETFramework,Version=v4.5.2”但此计算机没有,需要修改为v4.5.1.
每次下载别人的代码都会出现这样的问题,以为是没有安装.NETFramework,就下载安装了,但是每次安装都会出现已安装高版本的4.6(Win10自带),无需下次安装,但是每次VS中都会显示有问题,而 ...
- CSS 圆角
CSS代码: -moz-border-radius: 15px; /* Gecko browsers */ -webkit-border-radius: 15px; /* Webkit browser ...
- C#串口通信—传输文件测试
说明:该程序可能不具备实用性,仅测试用. 一.使用虚拟串口工具VSPD虚拟两个串口COM1和COM2 二.约定 占一个字节,代码如下: using System; using System.Colle ...
- 使用NuGet打包并发布至ProGet过程 (步骤详细,附python脚本)【上篇】
一.基本知识 (1)NuGet : NuGet是一个为大家所熟知的Visual Studio扩展,通过这个扩展,开发人员可以非常方便地在Visual Studio中安装或更新项目中所需要的第三方组件, ...
- javascript事件分类解析
最近在学习javascript,就顺便把常用事件给大家整理整理,也让自己加深印象.不足之处欢迎各位补充. 一般事件 onclick 鼠标点击时触发此事件 ondblclick 鼠标双击时触发此事件 ...
- Eclipse web项目引用其它项目时的部署问题
地址:http://blog.csdn.net/testcs_dn/article/details/43764497
- 应用服务器和Web服务器
如上图所示,绝大部分的公司会采用Apache+tomcat集群(或jetty集群)来部署公司的Web服务, Web服务器和应用服务器关系,先介绍一下我们常说的服务器: Tomcat服务器,是运行ser ...
- Verilog学习笔记简单功能实现(八)...............同步FIFO
Part 1,功能定义: 用16*8 RAM实现一个同步先进先出(FIFO)队列设计.由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出.写入和读出的操作(高电平有效)由时钟的上 ...
- nginx+uwsgi 部署 django
预装:nginx, django Django站点tree |Site |-----Blog(自建的项目) |-----Manage.py |-----Site(setting url wsgi-. ...
- mvc model 传值两种方式区别
1: controller中: public actionresult index() { M m=new M(); return view(m) } view中: @model.phone vs 中 ...