进程通信(IPC)之Messenger

bound服务是客户端-服务器模式的服务。

bound服务的创建方式之一:

创建一个支持绑定的服务时,你必须提供一个 IBinder,用作客户端和服务间进行通信的编程接口

使用Messenger定义该接口:

如果你需要接口跨越多个进程进行工作,可以通过Messenger来为服务创建接口。在这种方式下,服务定义一个响应各类消息对象MessageHandler。此HandlerMessenger与客户端共享同一个IBinder的基础,它使得客户端可以用消息对象Message向服务发送指令。此外,客户端还可以定义自己的Message,以便服务能够往回发送消息。

简单的说,就是服务和客户端都要有自己的Messenger,然后通过handler处理各自Messenger发送的message消息。(客户端和服务相互响应的原理)。

public class MessageService  extends Service{
 //本例的Service在声明时必须对外开放,即android:exported="true"。
 //Messenger通信是不支持多线程的,要用到多线程就该换成AIDL通信
 public static final int WHAT_1=1;
 Messenger client_messenger;
 
    @Override
    public void onCreate() {
     super.onCreate();
    }
   
 public IBinder onBind(Intent intent) {
  
  return messenger.getBinder();
 }
 public void onDestroy() {
  
  super.onDestroy();
 }
 
 //通过handler创建一个messenger,Messenger实质是对handler的引用
 final Messenger messenger=new Messenger(new MessageHandler());
 
 //定义一个handler子类。用于接受message对象
 class MessageHandler extends Handler{
  @Override
  public void handleMessage(Message msg) {
   
   switch (msg.what) {
    case WHAT_1:
     
     client_messenger=msg.replyTo;//接受到传递过来的,客户端的Messsenger. 通过该Messenger发送消息到客户端
     
     break;
 
    default:
     super.handleMessage(msg);
   }
 
  }
 }
 
 
 //发送客户端要处理的message
 public void sendClientMessage(){
   Message message=Message.obtain(null, MessageActivity.CLIENT_WAHT, null);
   try {
    client_messenger.send(message);
   } catch (RemoteException e) {
    e.printStackTrace();
   }
  }

}

public class MessageActivity extends Activity {
 //Service的Messenger对象
 Messenger service_messenger=null;
 
 //客户端的Messenger对象
 Messenger client_messenger=new Messenger(new ClientHandler());
 
 boolean isBound;
 Message message;
 final static int CLIENT_WAHT=2;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
 }
 
 //绑定和解绑Service都是按需求而定的,说白了,哪里要用,就在那里绑定(或者解绑)。
 protected void onStart() {
  Intent intent=new Intent(this,MessageService.class);
  bindService(intent, connection, Context.BIND_AUTO_CREATE);//通过绑定方式开启服务
  super.onStart();
 }
 protected void onStop() {
  //解除绑定
  if(isBound){
   unbindService(connection);
  }
  super.onStop();
 }
 
 
 public void sendServiceMessage(){
  if(isBound){
   return ;
  }
  String content="Messenger方式解决当前service要被其他运用程序调用或者要跨多个进程间的通信";
  message=Message.obtain(null,  MessageService.WHAT_1  ,null);
  message.obj=content;
  message.replyTo=client_messenger; //将客户端的Messenger传递到Service中。不需要Service响应,则不需要写这行代码
  //在Service里将通过客户端的Messenger发送消息到对应的客户端,然后进行处理( Service 响应客户端的原理 )
  try {
   service_messenger.send(message);
  } catch (RemoteException e) {
   e.printStackTrace();
  }
 }
 
 
 ServiceConnection  connection=new ServiceConnection() {
  //与服务连接发生中断时(比如service崩溃或者被系统杀死)会被调用
  //注意点:activity解除绑定不会调用
  public void onServiceDisconnected(ComponentName arg0) {
   isBound=false;
   service_messenger=null;
  }
  //当与service绑定时会调用。  通过Messenger与Service进行通信
  public void onServiceConnected(ComponentName className, IBinder ibinder) {
   isBound=true;
   service_messenger=new Messenger(ibinder); //获取到Service中的Messenger对象
   
  }
 };
 
 
 
 //用于处理Service传递的信息
 class ClientHandler extends Handler{
  public void handleMessage(Message msg) {
   switch (msg.what) {
    case CLIENT_WAHT:
     //需求而定,执行操作
     break;
 
    default:
     super.handleMessage(msg);
   }
   
 
  }
 }

}

时间: 2024-08-10 22:39:05

进程通信(IPC)之Messenger的相关文章

linux应用程序开发-进程通信(IPC)

IPC why: 1.数据传输 2.资源共享 目的: 3.通知事件 4.进程控制 发展: 1.UNIX进程间通信 2.基于SYStem V 3.POSIX 方式分类: 1.pipe(管道) FIFO(有名管道) 2.signal 3.消息队列 4.共享内存 5.信号量 6.套接字(socket) 管道通信:单向,先进先出 创建 pipe:父子之间通讯 FIFO:任意 创建: int pipe(int filedis[2]); 管道创建时,产生两个文件描述符:filedis[0]读管道,filed

Android进程通信之Messenger&AIDL使用详解

1. 前言 提到的进程间通信(IPC:Inter-Process Communication),在Android系统中,一个进程是不能直接访问另一个进程的内存的,需要提供一些机制在不同的进程之间进行通信,Android官方推出了AIDL(Android Interface Definition Language),它是基于Binder机制的,至于官方为什么要采用Binder,查看为什么Android要采用Binder作为IPC机制,分析很全面. 上篇Android之Service的细枝末节提到组

Android 之 IPC 进程通信全解析

Android 之 IPC 进程通信全解析 本篇博客的框架 什么是IPC IPC(Inter-Process Communication) 进程间通信,是指两个不同进程之间数据交换的过程. 在明确其之前,需要先搞懂几个概念: 线程:CPU可调度的最小单位,是程序执行流的最小单元:线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源. 进程: 一个执行单元,在PC 和移动设备上一

跨进程通信之Messenger

1.简介 Messenger,顾名思义即为信使,通过它可以在不同进程中传递Message对象,通过在Message中放入我们需要的入局,就可以轻松实现数据的跨进程传递了.Messenger是一种轻量级的IPC方案,其底层实现是AIDL. Messenger的使用方法很简单,它对AIDL进程了封装,并且由于它一次只处理一个请求,因此在服务端我们不需要考虑同步的问题. 2.实现跨进程通信 1)服务端进程 首先我们需要在服务端创建一个Service来处理客户端的连接请求,同时创建一个Handler并通

Android基础——Messenger在跨进程通信中的使用

Messenger在跨进程通信中的使用 事先说明: 本人也是个初学者,所以本文是从初学者的角度入手,如果有不妥的地方请留言教导我,谢谢. 本篇文章主要针对讲解Messenger的使用和Messenger在应用层上的原理解析和Messenger在服务端的回复. 什么是Messenger? Messenger可以翻译为信使,Messenger是一种轻量级的IPC方案,通过它可以在不同进程中传递Message对象,在Message中放入我们需要传递的数据,就可以实现数据的进程间传递了. 步骤一:Mes

messenger跨进程通信出现ClassNotFoundException...

利用messenger实现remote进程的service和主进程通信的时候报错com.xxx.xxx.xxx.bean.xxxbean on path: DexPathList[[directory .],nativeLibraryDirectories=[/vendor/lib, /data/cust/lib, /system/lib]] 看log发现错误处是在client解析从service发过来的message中的bundle对象, 网上搜了有人说是因为类加载器的问题,然后自己在   d

linux各种IPC机制(进程通信)

linux各种IPC机制 (2011-07-08 16:58:35)     原文地址:linux各种IPC机制(转)作者:jianpengliu 原帖发表在IBM的developerworks网站上,是一个系列的文章,作者郑彦兴,通过讲解和例子演示了Linux中几种IPC的使用方式,我觉得很好,在这里做一个保留,能看完的话Linux IPC的基础是没有问题的了.一)Linux环境进程间通信(一)管道及有名管道http://www.ibm.com/developerworks/cn/linux/

IPC进程通信

这两天学习的东西有点多,感觉完全应付不过来了 ,一直在消化这几天学习的东西所以2号.3号.4号的学习内容没有及时总结,在此表示深深的愧疚,今天把这些天学习的知识点汇总一下. 主要学习了IPC进程间通信,目前我所理解的IPC主要包括管道.共享内存.信号量. 总结IPC前先复习一下多进程: 一.进程创建: 1.system函数 通过调用shell程序/bin/sh –c来执行string所指定的命令,该函数在内部是通过调用execve("/bin/sh",..)函数来实现的.通过syste

android进程通信之Messenger

写在前面的话 前面我写了一篇文章-android学习之remote service 的aidl详解,讲到跨进程多线程通信,我们使用aidl技术来实现.但是平时我们可能只要要求跨进程通信,而不需要使用多线程,那么这时候,Messenger就是我们的一个非常好的选择. Messenger实例 Server端: MessengerService.java import android.app.Service; import android.content.Intent; import android.

操作系统:进程通信(IPC)

进程通信:进程间的信息交换. 进程是分配系统资源的单位,因此各进程拥有的内存地址空间相互独立. 为了保证安全,一个进程不能直接访问另一个进程的地址空间. 为了保证进程间的安全通信,操作系统提供了一些方法. 管道 管道:指用于连接读写进程的一个共享文件,又名pipe文件.其实就是在内存中开辟的一个大小固定的缓冲区. 命名管道(FIFO) 它是一种文件类型. FIFO可以在无关进程之间交换数据. FIFO以一种特殊设备文件形式存在于文件系统中. FIFO的通信方式类似于在进程中使用文件来传输数据,只