Android使用Messenger进行Service IPC通信分析

如果想要进行IPC通信,一般写一个AIDL接口,再写一个Service子类,然后实现AIDL接口 当做IBinder返回给Activity界面层。

如果不想写AIDL接口文件,只是单I线程中与Service进行通信 我们可以用Android写好的Messenger类来处理,一样能将消息传递给Service进行通信。

先写上基本代码:

public class MyService extends Service {

	Messenger messenger = null;

	public MyService() {
	}

	@Override
	public void onCreate() {
		super.onCreate();
		messenger = new Messenger(handler);//实例化一个对象,并将Handler传入绑定,UI MQ消息检测
	}

	Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			Log.d("","Msg:" + msg.what + ";" + msg.obj);
		}
	};
	/* (non-Javadoc)
	 * @see android.app.Service#onBind(android.content.Intent)
	 */
	@Override
	public IBinder onBind(Intent arg0) {
		return messenger.getBinder();//返回Binder接口
	}

}

MyActivity 中部分代码

<span style="white-space:pre">	</span>Messenger messenger;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		bindService(new Intent(this,MyService.class), conn, Context.BIND_AUTO_CREATE);//一样绑定一个Connection
	}

	private ServiceConnection conn = new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName cn) {
		}

		@Override
		public void onServiceConnected(ComponentName cn, IBinder ibiner) {
			messenger = new Messenger(ibiner);//得到Service中的Messenger
			Log.d("","OK messenger connected........");
		}
	};

	public void sendMsg(int what, String msg){ //这个方法就是自己的业务信息发送消息 传递到Service中 有 Handler处理。
		if (messenger == null) {
			return;
		}
		Message msg1 = Message.obtain();
		msg1.what = what;
		msg1.obj = msg;
		try {
			messenger.send(msg1);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}

以上的代码非常简单。

下面看看Messenger源码其实是个包装类,它本身就是可以被IPC投递的对象,因为用了Parcelable接口。

    public Messenger(Handler target) { //之前传递的Handler到这里,
        mTarget = target.getIMessenger(); //得到的其实是Handler里面的IMessenger接口
    }
    public void send(Message message) throws RemoteException {
        mTarget.send(message);//具体有IMessenger接口发送
    }

    public IBinder getBinder() {
        return mTarget.asBinder();
    }
    //注释我都去掉了

再看看Handler源码是如何发消息的

    final IMessenger getIMessenger() {
        synchronized (mQueue) {
            if (mMessenger != null) {
                return mMessenger;
            }
            mMessenger = new MessengerImpl();//这个实现了IMessenger远程IPC接口,AIDL
            return mMessenger;
        }
    }

    private final class MessengerImpl extends IMessenger.Stub { //实现在这个地方
        public void send(Message msg) {
            Handler.this.sendMessage(msg);//本质上还是有 Handler来发送消息
        }
    }

可以看出IMessenger这个远程通信IPC接口 包含了send(Message msg)方法,其本质还是获取了我们MyService中的Handler对象进行发送消息。

IMessenger.aidl

内容如下

package android.os;

import android.os.Message;

/** @hide */
oneway interface IMessenger {
    void send(in Message msg);
}

以上源码是4.1版本的 新版的源码没去研究,这部分应该是一致的。下面是个简单的草图,算是个总结。

时间: 2024-10-20 09:53:57

Android使用Messenger进行Service IPC通信分析的相关文章

Android Service IPC通信之Messenger机制

概述 之前我写过一篇博客介绍Service:Android Service全面解析,里面讲过如何实现Service的跨进程(IPC)通信,主要是通过编写AIDL接口文件来实现的.本篇我们来讲讲Service IPC通信的另外一种方式-Messenger. Messenger,也称为信使,通过它可以在不同的进程间传递message对象,在message中放入我们需要传递的数据你就可以实现跨进程通信和传递数据了.所以说Messenger机制是基于消息的跨进程通信方式. 可以看到,我们可以在客户端发送

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

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

Android Activity与远程Service的通信学习总结

当一个Service在androidManifest中被声明为 process=":remote", 或者是还有一个应用程序中的Service时,即为远程Service, 远程的意思是和当前程序不在同一个进程中执行. Activity和远程Service的跨进程通信(IPC)通过Binder机制,使用AIDL服务实现. 一.  定义远程服务端 1.新建一个project,project文件夹例如以下 2. 文件内容 aidl传递复杂对象时,须要该对象实现Parcelable或Seria

Android -- 跨应用绑定service并通信

之前记录过跨应用绑定service:http://blog.csdn.net/gaopeng0071/article/details/46049929,那么绑定后如何进行通信呢,下面我们就来学习下. 第一步, 需要修改service1项目中aidl,增加一个方法. package com.example.service1.aidl; interface IMyService { void basicType(); void setName(String name); } setName用于存储n

android IPC通信(上)-sharedUserId&amp;amp;&amp;amp;Messenger

看了一本书,上面有一章解说了IPC(Inter-Process Communication,进程间通信)通信.决定结合曾经的一篇博客android 两个应用之间的通信与调用和自己的理解来好好整理总结一下这块的知识.因为内容较多,这部分会分上中下三篇博客来细致分析解说,第一篇上篇要解说的是sharedUserId和Messenger的使用方式. android IPC通信(中)-ContentProvider&&Socket android IPC通信(下)-AIDL sharedUserI

android ipc通信机制之二序列化接口和Binder

IPC的一些基本概念,Serializable接口,Parcelable接口,已经Binder.此核心为最后的IBookManager.java类!!! Serializable接口,Parcelable接口都是可以完成对象的序列化过程. 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. 两者均可以实现序列化并且都可以用于Intent数

android IPC通信(下)-AIDL

android IPC通信(上)-sharedUserId&&Messenger android IPC通信(中)-ContentProvider&&Socket 这篇我们将会着重介绍AIDL的使用方式和原理,要介绍AIDL先要简单介绍一下Binder,而且Messenger,ContentProvider和AIDL的最底层都是使用的Binder. Binder 直观来说,Binder是Android中的一个类,它实现了IBinder接口.从IPC角度来说,Binder是A

Android中通过Messenger与Service实现进程间双向通信

Android中的Service和其调用者既可以在同一个App中,也可以在不同的App.如果Service在App1中,而调用Service的客户端在App2中,那么我们就可以用Service实现进程间的相互通信.本文将介绍如何通过bindService和Messenger实现进程间通信(IPC),如果对bindService绑定服务和Binder不熟悉,可参见<Android中bindService的使用及Service生命周期>,理解该博文是本文的基础. 让Service实现与其他进程通信

Android:(本地、可通信的、前台、远程)Service使用全面介绍

前言 Service作为Android四大组件之一,应用非常广泛 本文将介绍Service最基础的知识:Service的生命周期 如果你对Service还未了解,建议先阅读我写的文章: Android四大组件:Service史上最全面解析 目录 1. Service分类 1.1 Service的类型 1.2 特点 2.具体使用解析 2.1 本地Service 这是最普通.最常用的后台服务Service. 2.1.1 使用步骤 步骤1:新建子类继承Service类 需重写父类的onCreate()