Messenger:使用消息的跨进程通信 (Message.replyTo()的使用)
来源:互联网 发布:java小游戏程序代码 编辑:程序博客网 时间:2024/05/20 13:16
Messenger:使用消息的跨进程通信 (Message.replyTo()的使用)
原文链接:http://xwangly.iteye.com/blog/1109424
Messenger:信使
官方文档解释:它引用了一个Handler对象,以便others能够向它发送消息(使用mMessenger.send(Message msg)方法)。该类允许跨进程间基于Message的通信(即两个进程间可以通过Message进行通信),在服务端使用Handler创建一个Messenger,客户端持有这个Messenger就可以与服务端通信了。
以前我们使用Handler+Message的方式进行通信,都是在同一个进程中,从线程持有一个主线程的Handler对象,并向主线程发送消息。
而Android既然可以使用bindler机制进行跨进行通信,所以我们当然可以将Handler与bindler结合起来进行跨进程发送消息。
查看API就可以发现,Messenger就是这种方式的实现。
一般使用方法如下:
1。远程通过
2。客户端使用bindlerService请求连接远程
3。远程onBind方法返回一个bindler
return mMessenger.getBinder();
5。客户端可以使用这个远程信使对象向远程发送消息:rMessenger.send(msg);
这样远程服务端的Handler对象就能收到消息了,然后可以在其handlerMessage(Message msg)方法中进行处理。(该Handler对象就是第一步服务端创建Messenger时使用的参数mHandler).
经过这5个步骤貌似只有客户端向服务端发送消息,这样的消息传递是单向的,那么如何实现双向传递呢?
首先需要在第5步稍加修改,在send(msg)前通过msg.replyTo = mMessenger将自己的信使设置到消息中,这样服务端接收到消息时同时也得到了客户端的信使对象了,然后服务端可以通过
双向通信宣告完成。
下面改写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";@Overridepublic void onDestroy() {// TODO Auto-generated method stubLog.i(TAG, "onDestroy");cMessenger = null;super.onDestroy();}@Overridepublic boolean onUnbind(Intent intent) {// TODO Auto-generated method stubLog.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() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubLog.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 blocke.printStackTrace();}break;default:super.handleMessage(msg);}}};/** * 自己的信使对象 */private Messenger mMessenger = new Messenger(mHandler);/** * 客户的信使 */private Messenger cMessenger;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubLog.i(TAG, "onBind");//返回自己信使的bindler,以供客户端通过这个bindler得到服务端的信使对象(通过new Messenger(bindler))return mMessenger.getBinder();}@Overridepublic void onRebind(Intent intent) {// TODO Auto-generated method stubLog.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 implementsView.OnClickListener {private String TAG = "Binding";TextView mCallbackText;private boolean isBound;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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() {@Overridepublic 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 stubLog.i(TAG, "onServiceConnected");rMessenger = new Messenger(service);mMessenger = new Messenger(mHandler);sendMessage();}public void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stubrMessenger = null;}};public void onClick(View v) {// TODO Auto-generated method stubIntent 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 stubMessage message = Message.obtain(null, MessengerService.MSG_SET_VALUE);message.replyTo = mMessenger;try {rMessenger.send(message);} catch (RemoteException e) {// TODO Auto-generated catch blocke.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>
- Messenger:使用消息的跨进程通信 (Message.replyTo()的使用)
- Messenger:使用消息的跨进程通信
- Messenger:使用消息的跨进程通信
- Messenger:使用消息的跨进程通信
- Messenger:使用消息的跨进程通信
- Messenger:使用消息的跨进程通信
- Messenger:使用消息的跨进程通信
- Handler的跨进程使用--Messenger学习
- Android Messenger简单的跨进程通信
- IPC跨进程交互(1)Messenger的使用
- Android 使用Messenger实现跨进程之间通信
- Android中跨进程通信方式之使用Messenger
- 基于Message的跨进程通信
- Messenger 跨进程通信
- Android跨进程通信-AIDL的使用
- android Messenger 跨进程通信
- android Messenger 跨进程通信
- Android Messenger 跨进程通信!!!!!!!!!!!!!!!!!!
- hdu 3400 Line belt(三分)
- 英语练习52 You're Sally,aren't you
- mfc类视图中view类消失的解决办法
- URL分析小结
- Struts2中关于filter的配置问题
- Messenger:使用消息的跨进程通信 (Message.replyTo()的使用)
- 记微博上一次“落荒而逃”
- 寻找丑数
- Class.forName
- cocos2d异常
- nslookup命令用法
- org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'xx' is defined
- 于函数strtok和strtok_r的使用要点和实现原理(一)
- railsyardcms精读(2)