`
xwangly
  • 浏览: 132265 次
  • 性别: Icon_minigender_1
  • 来自: 鄂州
社区版块
存档分类
最新评论

Messenger:使用消息的跨进程通信

阅读更多

Messenger:信使

官方文档解释:它引用了一个Handler对象,以便others能够向它发送消息(使用mMessenger.send(Message msg)方法)。该类允许跨进程间基于Message的通信(即两个进程间可以通过Message进行通信),在服务端使用Handler创建一个Messenger,客户端持有这个Messenger就可以与服务端通信了。

 

以前我们使用Handler+Message的方式进行通信,都是在同一个进程中,从线程持有一个主线程的Handler对象,并向主线程发送消息。

而Android既然可以使用bindler机制进行跨进行通信,所以我们当然可以将Handler与bindler结合起来进行跨进程发送消息。

查看API就可以发现,Messenger就是这种方式的实现。

一般使用方法如下:

1。远程通过

mMessenger = new Messenger(mHandler)

 创建一个信使对象

2。客户端使用bindlerService请求连接远程

3。远程onBind方法返回一个bindler

return mMessenger.getBinder();

 4.客户端使用远程返回的bindler得到一个信使(即得到远程信使)

			public void onServiceConnected(ComponentName name, IBinder service) {
				rMessenger = new Messenger(service);
        ......
			}

 这里虽然是new了一个Messenger,但我们查看它的实现

    /**
     * Create a Messenger from a raw IBinder, which had previously been
     * retrieved with {@link #getBinder}.
     * 
     * @param target The IBinder this Messenger should communicate with.
     */
    public Messenger(IBinder target) {
        mTarget = IMessenger.Stub.asInterface(target);
    }

 发现它的mTarget是通过Aidl得到的,实际上就是远程创建的那个。

5。客户端可以使用这个远程信使对象向远程发送消息:rMessenger.send(msg);

这样远程服务端的Handler对象就能收到消息了,然后可以在其handlerMessage(Message msg)方法中进行处理。(该Handler对象就是第一步服务端创建Messenger时使用的参数mHandler).

 

经过这5个步骤貌似只有客户端向服务端发送消息,这样的消息传递是单向的,那么如何实现双向传递呢?

首先需要在第5步稍加修改,在send(msg)前通过msm.replyTo = mMessenger将自己的信使设置到消息中,这样服务端接收到消息时同时也得到了客户端的信使对象了,然后服务端可以通过

//得到客户端的信使对象,并向它发送消息
cMessenger = msg.replyTo;
cMessenger.send(message);

 即完成了从服务端向客户端发送消息的功能,这样客服端可以在自己的Handler对象的handlerMessage方法中接收服务端发送来的message进行处理。

双向通信宣告完成。

 

下面改写ApiDemos工程实现Messenger通信

MessengerService.java

package com.xwangly.apidemo.app;

import java.util.Random;

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;

public class MessengerService extends Service {
	private String TAG = "MessengerService";

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		Log.i(TAG, "onDestroy");
		cMessenger = null;
		super.onDestroy();
	}

	@Override
	public boolean onUnbind(Intent intent) {
		// TODO Auto-generated method stub
		Log.i(TAG, "onUnbind");
		return super.onUnbind(intent);
	}

	static final int MSG_REGISTER_CLIENT = 1;
	static final int MSG_UNREGISTER_CLIENT = 2;
	static final int MSG_SET_VALUE = 3;

	private Random random = new Random();

	private Handler mHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			Log.i(TAG, "handleMessage");
			switch (msg.what) {
			case MSG_SET_VALUE:
				try {
					Message message = Message.obtain(null,
							MessengerService.MSG_SET_VALUE);
					message.arg1 = random.nextInt(100);
					
					//得到客户端的信使对象,并向它发送消息
					cMessenger = msg.replyTo;
					cMessenger.send(message);
				} catch (RemoteException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				break;
			default:
				super.handleMessage(msg);
			}

		}
	};

	/**
	 * 自己的信使对象
	 */
	private Messenger mMessenger = new Messenger(mHandler);

	/**
	 * 客户的信使
	 */
	private Messenger cMessenger;

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		Log.i(TAG, "onBind");
		//返回自己信使的bindler,以供客户端通过这个bindler得到服务端的信使对象(通过new Messenger(bindler))
		return mMessenger.getBinder();
	}

	@Override
	public void onRebind(Intent intent) {
		// TODO Auto-generated method stub
		Log.i(TAG, "onRebind");

	}

}

 MessengerServiceActivities.java

package com.xwangly.apidemo.app;

import com.xwangly.apidemo.R;

import android.app.Activity;
import android.content.ComponentName;
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.util.Log;
import android.view.View;
import android.widget.TextView;

public class MessengerServiceActivities {
	public static class Binding extends Activity implements
			View.OnClickListener {
		private String TAG = "Binding";

		TextView mCallbackText;

		private boolean isBound;

		@Override
		protected void onCreate(Bundle savedInstanceState) {
			// TODO Auto-generated method stub
			super.onCreate(savedInstanceState);
			setContentView(R.layout.messenger_service_binding);
			findViewById(R.id.bind).setOnClickListener(this);
			findViewById(R.id.unbind).setOnClickListener(this);

			mCallbackText = (TextView) findViewById(R.id.callback);
			mCallbackText.setText("Not attached.");

		}

		private Handler mHandler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				Log.i(TAG, "handleMessage");
				switch (msg.what) {
				case MessengerService.MSG_SET_VALUE:
					mCallbackText.setText("Received from service: " + msg.arg1);
					break;
				default:
					super.handleMessage(msg);
				}
			}
		};

		/**
		 * 自己的信使
		 */
		private Messenger mMessenger;
		
		/**
		 * 远程服务的信使
		 */
		private Messenger rMessenger;
		
		private ServiceConnection connection = new ServiceConnection() {

			public void onServiceConnected(ComponentName name, IBinder service) {
				// TODO Auto-generated method stub
				Log.i(TAG, "onServiceConnected");
				rMessenger = new Messenger(service);
				mMessenger = new Messenger(mHandler);
				
				sendMessage();
			}


			public void onServiceDisconnected(ComponentName name) {
				// TODO Auto-generated method stub
				rMessenger = null;
			}
		};

		public void onClick(View v) {
			// TODO Auto-generated method stub
			Intent intent = new Intent(
					"com.xwangly.apidemo.app.messenger_service");
			switch (v.getId()) {
			case R.id.bind:
				if (!isBound) {
					isBound = bindService(intent, connection, BIND_AUTO_CREATE);
					//isBound = true;
				}else {
					sendMessage();
				}
				break;
			case R.id.unbind:
				if (isBound) {
					unbindService(connection);
					isBound = false;
				}
				break;
			default:
				break;
			}
		}
		
		/**
		 * 使用服务端的信使向它发送一个消息。
		 */
		private void sendMessage() {
			// TODO Auto-generated method stub
			Message message = Message.obtain(null, MessengerService.MSG_SET_VALUE);
			message.replyTo = mMessenger;
			try {
				rMessenger.send(message);
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}

 AndroidManifest.xml相关配置如下:

		<service android:name=".app.MessengerService" >
			<intent-filter>
				<action android:name="com.xwangly.apidemo.app.messenger_service" />
			</intent-filter>
		</service>
        <activity android:name=".app.MessengerServiceActivities$Binding"
                android:label="@string/activity_messenger_service_binding"
                android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

 至于layout就不帖了,两个按钮一个文本域。

 

分享到:
评论
2 楼 freeliver54 2011-12-27  
好!
已转载http://www.cnblogs.com/freeliver54/archive/2011/12/27/2303790.html
1 楼 huipahaimian 2011-07-28  
很好,顶!

相关推荐

    Messenger实现跨进程通信

    本文将深入探讨如何利用Android的`Messenger`组件来实现简单的跨进程通信。 `Messenger`是Android提供的一种轻量级的IPC解决方案,它基于`Handler`机制,通过消息对象(`Message`)进行数据传递。这种通信方式相对...

    使用Messenger实现跨进程通信(IPC)

    代码中包含两个应用程序,两者之间通信采用Messenger信使 使用方法:将下载下来的图片后缀名改为.zip,再解压即可得到源代码

    AIDL、Messenger 两种方式实现跨进程通信,传递自定义数据

    本篇文章将深入探讨如何利用AIDL(Android Interface Definition Language)和Messenger服务这两种方式来实现跨进程通信,并传递自定义数据。 首先,我们来了解一下AIDL。AIDL是Android为开发者提供的一个工具,...

    Android跨进程通信demo

    在Android系统中,跨进程通信(IPC,Inter-Process Communication)是实现不同应用程序之间数据交换的关键技术。Android的IPC机制主要包括Binder、AIDL(Android Interface Definition Language)、ContentProvider...

    Android跨进程通信Binder、Messenger、AIDL

    Android提供了多种跨进程通信的方式,其中Binder、Messenger和AIDL是最常见且重要的三种。下面将详细阐述这三种机制的工作原理、使用场景以及如何实现。 **Binder** Binder是Android系统的核心组件,是Android IPC...

    Messenger跨进程通信.zip

    本示例是一个关于如何使用Messenger进行跨进程通信的实战演示,包含了客户端和服务端两个模块。 首先,我们来看一下`aidl`,它是Android Interface Definition Language的缩写,用于定义进程间通信的接口。在服务端...

    Messenger进程间通信

    "Messenger进程间通信"是一种轻量级的IPC方式,常用于简单的双向通信场景。在这个主题中,我们将深入探讨Messenger服务端(Service)和客户端(Activity)的实现细节。 首先,`MessengerService`是服务端的核心组件...

    android messenger进程通信

    总结来说,Android的Messenger是实现简单进程间通信的有效工具,它简化了Binder的使用,使得开发者能够轻松地在服务和客户端之间传递消息。在实际开发中,理解并熟练运用Messenger,能够帮助我们构建更健壮、高效的...

    Android IPC机制利用Messenger实现跨进程通信

    本文将重点探讨如何利用Messenger实现Android的跨进程通信。Messenger是一种轻量级的IPC机制,它基于Handler和Message,允许服务端和客户端之间进行一对一的消息传递,适合于简单的双向通信场景。 首先,让我们了解...

    Andorid Messenger 进程间通信

    本教程将深入探讨如何使用Messenger实现Activity和Service之间的跨进程通信。 首先,我们了解下Messenger的基本概念。Messenger是一个实现了Handler接口的类,它的主要作用是封装了Message对象的发送和接收。在...

    IPCDemo跨进程通信

    Messenger是基于Handler和Message的一种轻量级跨进程通信方式。它通过AIDL(Android Interface Definition Language)定义服务接口,服务端创建一个Message队列并绑定到Handler,客户端通过发送消息与服务端交互。...

    轻量级进程间通信框架,基于 Messenger 实现 进程间传递数据不错的选择

    1. **简单易用**:相比于其他更复杂的IPC方式,如AIDL(Android Interface Definition Language),Messenger的API更简洁,适合快速实现简单的跨进程通信。 2. **轻量级**:由于基于Binder,Messenger的开销相对较...

    Android 跨进程通信 代码

    此外,Android还提供了其他跨进程通信方式,如BroadcastReceiver(广播)、ContentProvider(内容提供者)和Messenger。BroadcastReceiver适用于全局范围的消息传递,ContentProvider用于读写共享数据,而Messenger...

    android多进程通信二

    在提供的clientproject和serverproject中,我们可以看到具体的多进程通信实现案例,包括Binder、ContentProvider等方法的使用,通过学习和实践这些项目,能更深入地理解和掌握Android多进程通信。

    IPC之使用Messenger进程间通信

    IPC是Inter-Process Communication的缩写,意为进程间通信或者跨进程通信,是指两个进程进行数据交换的过程。本code是使用Messenger来完成进程间通信的,后续会继续上传别的通信方式Demo.

    android进程通信之使用Messenger

    总结,通过Messenger进行Android进程通信,可以简化AIDL的使用,适用于简单的数据交换场景。不过,对于更复杂的通信需求,如需要传输Parcelable对象或者更高效的通信,可能需要考虑使用AIDL或其他更强大的IPC机制,...

    intent messenger aidl实现进程间通信.zip

    Intent还可以用来启动跨进程的BroadcastReceiver,使得不同进程能够接收和响应特定的广播事件。 2. **Messenger**: Messenger是一种轻量级的IPC方案,适用于服务和服务之间的通信。它基于Handler和Message机制,...

    Messenger的使用demo

    在Android开发中,Messenger是一种轻量级的跨进程通信(IPC, Inter-Process Communication)机制,主要用于服务(Service)之间或者应用组件与服务之间的通信。本教程将介绍如何使用Messenger来实现在不同进程间的...

    进程间通信Messenger

    在这个“进程间通信Messenger”示例中,我们将深入探讨如何使用Android的Messenger服务来实现简单的IPC。 Messenger是Android提供的一种轻量级的IPC机制,主要用于在客户端和服务端之间传递消息。它基于AIDL...

    Messenger-比AIDL简单的跨进程通讯

    总结来说,虽然AIDL提供了更全面的IPC功能,但针对简单的需求,使用Messenger可以更快地实现跨进程通信。开发者应根据实际需求选择合适的通信方式。在实际开发中,理解并熟练掌握这两种方法,有助于提高代码的可维护...

Global site tag (gtag.js) - Google Analytics