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层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信.它分为流式套接字和数据包套接 ...
随机推荐
- SQL 聚合函数
SQL聚合函数 MAX---最大值 MIN--最小值 AVG--平均值 SUM--求和 COUNT--记录的条数 EXample: --从MyStudent表中查询最大年龄,最小年龄,平均年龄,年龄的 ...
- CaptureManagerSDK
Simple SDK for capturing, recording and streaming video and audio from web-cams on Windows OS by Win ...
- C# 异步工具类 及一点小小的重构经验
2015年新年第一篇随笔, 祝福虽然有些晚,但诚意还在:新年快乐. 今天主要是想分享一异步工具类,在C/S架构中.先进行网络资源异步访问,然后将回调函数 Invoke到UI线程中进行UI处理. 这样的 ...
- 富客户端 wpf, Winform 多线程更新UI控件
前言 在富客户端的app中,如果在主线程中运行一些长时间的任务,那么应用程序的UI就不能正常相应.因为主线程要负责消息循环,相应鼠标等事件还有展现UI. 因此我们可以开启一个线程来格外处理需要长时间的 ...
- MVC之前的那点事儿系列
MVC之前的那点事儿系列,是笔者在2012年初阅读MVC3源码的时候整理的,主要讲述的是从HTTP请求道进入MVCHandler之前的内容,包括了原创,翻译,转载,整理等各类型文章,当然也参考了博客园 ...
- 最近Google经常打不开?
最近听好多同事讲google打不开,无法进行搜索,用了代理之后速度还是很慢,而百度搜索又不佳… 就在此分享一些google地址: 个人收藏夹的: 203.208.46.144(这段时间推荐使用这4个地 ...
- 习题:codevs 1519 过路费 解题报告
今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...
- BaseActivity的抽取
Activity有些公共部分,比如setContentView.Activity管理.初始化操作.联网操作.Activity跳转.关闭当前Activity.保存用户登录信息.读取用户登录信息等. 我们 ...
- 在selenium2.0中使用selenium1.0的API
Selenium2.0中使用WeDriver API对页面进行操作,它最大的优点是不需要安装一个selenium server就可以运行,但是对页面进行操作不如selenium1.0的Selenium ...
- Jmeter常用函数之__CSVRead使用
__CSVRead函数用于对脚本进行参数话,当脚本中不同变量需要不同参数值时,可以考虑__CSVRead函数. 以登录的用户名.密码为例:实际进行压力测试时,需要模拟使用不同的用户并发访问系统,此时需 ...