文档章节

进程通信(IPC)之Messenger

新根
 新根
发布于 2015/08/01 17:38
字数 788
阅读 122
收藏 5

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);
   }
   
 
  }
 }
 


}

© 著作权归作者所有

新根
粉丝 5
博文 28
码字总数 9431
作品 0
深圳
程序员
私信 提问
加载中

评论(0)

Android 进程间通信——Service、Messenger

转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/74198534 Android四大组件(二)Service 接着上一篇Service基础知识,这一篇主要说下介绍下绑定的服务端的三种方式:同...

VNanyesheshou
2017/07/12
0
0
Android Binder原理(一)学习Binder前必须要了解的知识点

本文首发于微信公众号「后厂村码农」 关联系列 Android AOSP基础系列 Android系统启动系列 应用进程启动系列 Android深入四大组件系列 Android深入理解Context系列 Android深入理解JNI系列 ...

刘望舒
2019/10/24
0
0
跨进程通信之Messenger

1.简介 Messenger,顾名思义即为信使,通过它可以在不同进程中传递Message对象,通过在Message中放入我们需要的入局,就可以轻松实现数据的跨进程传递了。Messenger是一种轻量级的IPC方案,其...

lzwxx
2018/07/04
0
0
Android 进程间通信

要讲 Android 进程通信的话,就不得不先讲讲 Service. Service 是 Android 的四大组件之一,它主要的作用是后台执行操作,Activity 属于带有 UI 界面跟用户进行交互,而 Service 则没有 UI 界...

骑摩托马斯
2017/03/27
0
0
Android 使用Messenger跨进程通信框架

一.通过Binder绑定形式的通信 上一篇说道Binder机制的通信框架,也说过Messenger的底层实现自AIDL,因此对于跨进程通信中,Messenger是一种比较高级的框架,可以说对于一个app开发者来说重要性...

IamOkay
2014/12/04
340
0

没有更多内容

加载失败,请刷新页面

加载更多

如何离开/退出/停用Python virtualenv - How to leave/exit/deactivate a Python virtualenv

问题: I'm using virtualenv and the virtualenvwrapper. 我正在使用virtualenv和virtualenvwrapper。 I can switch between virtualenv's just fine using the workon command. 我可以使用......

javail
28分钟前
11
0
图片验证码输出 base64 字符串,适用于 自己存储key + 验证码来验证(不依赖于cookie)

<?php/** * @function getCode 生成验证码 * @author 张先生 * @date 2020-04-01 * @return array */// 获取验证码(参数:验证码个数,验证码宽度,验证码高度)if(!functio...

我才是张先生
50分钟前
9
0
SpringBoot和SpringCloud的区别

一、SpringBoot和SpringCloud简介 1、SpringBoot:是一个快速开发框架,通过用Maven依赖的继承方式,帮助我们快速整合第三方常用框架,完全采用注解化(使用注解方式启动SpringMVC),简化X...

安然_oschina
今天
19
0
IMX6ULL开发板-虚拟机安装Ubuntu系统

安装好了 VMware 虚拟机以后,我们就可以在 VMware 上安装 Ubuntu 系统了,首先我们去 Ubuntu 的 官网获取系统镜像,下载地址为:https://www.ubuntu.com/download/desktop,如下图所示: 从...

书白
今天
17
0
MyBatis Plus自定义SQL使用条件构造器QueryWrapper

1.注解的方式: @Select("select * from user_collection uc left join post p on uc.post_id = p.id ${ew.customSqlSegment}")IPage<Post> selectPosts(Page page, @Param(Constants.WRAP......

code-ortaerc
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部