- 浏览: 132265 次
- 性别:
- 来自: 鄂州
最新评论
-
xingfuyizhan:
写的很好,谢谢分享
方便实用的下拉刷新控件,支持ScrollView、AbsListView -
xingfuyizhan:
在Fragment中使用布局怎么显示不出来
方便实用的下拉刷新控件,支持ScrollView、AbsListView -
飞不过海:
Mybeautiful 写道显然有问题,return Bitm ...
Android根据指定的尺寸加载Bitmap -
Mybeautiful:
显然有问题,return BitmapFactory.deco ...
Android根据指定的尺寸加载Bitmap -
xhAndroid:
加入我工程的时候有个诡异的bug,下拉刷新布局就会覆盖主Vie ...
方便实用的下拉刷新控件,支持ScrollView、AbsListView
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就不帖了,两个按钮一个文本域。
评论
已转载http://www.cnblogs.com/freeliver54/archive/2011/12/27/2303790.html
发表评论
-
百度坐标与GPS坐标转换
2014-08-06 15:37 31495官网这么说的 4.3 百度坐标为何有偏移? 国际 ... -
仿网易新闻App
2014-02-25 14:29 1786最近项目更换了新的设计,实现了左右滑动、下拉刷新的 ... -
Android图片压缩
2014-01-17 10:45 912比较简单,直接上代码 public static ... -
方便实用的下拉刷新控件,支持ScrollView、AbsListView
2013-07-10 11:23 20494最近要做一个下拉刷新的功能,网上找了很多例子,也看了一些开 ... -
Android根据指定的尺寸加载Bitmap
2013-04-15 15:28 10968因为图片的尺寸千差百异,要想加载不同的图片,又要保证不影响整 ... -
Wifi层次结构状态机(一)
2012-03-06 13:32 1872Android2.3中Wifi的状态都是在WifiStateT ... -
来电上报流程
2011-07-26 15:26 1555最近项目在做一个双模手机,我负责电话框架层的移植,因此把2.3 ... -
Android MediaPlayer的生命周期
2011-06-27 16:46 1547Android MediaPlayer 的生 ... -
AsyncQueryHandler的理解
2011-06-20 19:42 7951每天进步一点点之AsyncQueryHandler学习 As ... -
TabHost学习总结
2011-06-17 17:31 6590需求: Android自带的TabHost为橫向的,而且样式 ... -
Phone去电请求及响应(framework层)
2011-06-02 16:58 1978打电话请求流程 1.进入键盘界面(TwelvekeyDiale ... -
去电流程
2011-05-27 17:10 1435去电流程: 广播:action="android.i ... -
Android Aidl机制
2011-05-27 14:44 2389Aidl机制提供进程间传递对象。 当然在进程间传递对象也可以使 ... -
转:android Menu理解
2011-05-12 20:56 2579学了较长时间的android. 有些东西都习以为常,不愿意去深 ... -
Android中如何调用其它应用
2011-05-05 19:40 1868每天进步一点点 Android中如何调用其它应用 如:我 ... -
ContentProvider
2011-04-29 17:14 1277每天进步一点 MyContentProvider extend ... -
AutoCompleteTextView
2011-04-29 16:54 1191每天成长一点 AutoCompleteTextView的适配器 ...
相关推荐
本文将深入探讨如何利用Android的`Messenger`组件来实现简单的跨进程通信。 `Messenger`是Android提供的一种轻量级的IPC解决方案,它基于`Handler`机制,通过消息对象(`Message`)进行数据传递。这种通信方式相对...
代码中包含两个应用程序,两者之间通信采用Messenger信使 使用方法:将下载下来的图片后缀名改为.zip,再解压即可得到源代码
本篇文章将深入探讨如何利用AIDL(Android Interface Definition Language)和Messenger服务这两种方式来实现跨进程通信,并传递自定义数据。 首先,我们来了解一下AIDL。AIDL是Android为开发者提供的一个工具,...
在Android系统中,跨进程通信(IPC,Inter-Process Communication)是实现不同应用程序之间数据交换的关键技术。Android的IPC机制主要包括Binder、AIDL(Android Interface Definition Language)、ContentProvider...
Android提供了多种跨进程通信的方式,其中Binder、Messenger和AIDL是最常见且重要的三种。下面将详细阐述这三种机制的工作原理、使用场景以及如何实现。 **Binder** Binder是Android系统的核心组件,是Android IPC...
本示例是一个关于如何使用Messenger进行跨进程通信的实战演示,包含了客户端和服务端两个模块。 首先,我们来看一下`aidl`,它是Android Interface Definition Language的缩写,用于定义进程间通信的接口。在服务端...
"Messenger进程间通信"是一种轻量级的IPC方式,常用于简单的双向通信场景。在这个主题中,我们将深入探讨Messenger服务端(Service)和客户端(Activity)的实现细节。 首先,`MessengerService`是服务端的核心组件...
总结来说,Android的Messenger是实现简单进程间通信的有效工具,它简化了Binder的使用,使得开发者能够轻松地在服务和客户端之间传递消息。在实际开发中,理解并熟练运用Messenger,能够帮助我们构建更健壮、高效的...
本文将重点探讨如何利用Messenger实现Android的跨进程通信。Messenger是一种轻量级的IPC机制,它基于Handler和Message,允许服务端和客户端之间进行一对一的消息传递,适合于简单的双向通信场景。 首先,让我们了解...
本教程将深入探讨如何使用Messenger实现Activity和Service之间的跨进程通信。 首先,我们了解下Messenger的基本概念。Messenger是一个实现了Handler接口的类,它的主要作用是封装了Message对象的发送和接收。在...
Messenger是基于Handler和Message的一种轻量级跨进程通信方式。它通过AIDL(Android Interface Definition Language)定义服务接口,服务端创建一个Message队列并绑定到Handler,客户端通过发送消息与服务端交互。...
1. **简单易用**:相比于其他更复杂的IPC方式,如AIDL(Android Interface Definition Language),Messenger的API更简洁,适合快速实现简单的跨进程通信。 2. **轻量级**:由于基于Binder,Messenger的开销相对较...
此外,Android还提供了其他跨进程通信方式,如BroadcastReceiver(广播)、ContentProvider(内容提供者)和Messenger。BroadcastReceiver适用于全局范围的消息传递,ContentProvider用于读写共享数据,而Messenger...
在提供的clientproject和serverproject中,我们可以看到具体的多进程通信实现案例,包括Binder、ContentProvider等方法的使用,通过学习和实践这些项目,能更深入地理解和掌握Android多进程通信。
IPC是Inter-Process Communication的缩写,意为进程间通信或者跨进程通信,是指两个进程进行数据交换的过程。本code是使用Messenger来完成进程间通信的,后续会继续上传别的通信方式Demo.
总结,通过Messenger进行Android进程通信,可以简化AIDL的使用,适用于简单的数据交换场景。不过,对于更复杂的通信需求,如需要传输Parcelable对象或者更高效的通信,可能需要考虑使用AIDL或其他更强大的IPC机制,...
Intent还可以用来启动跨进程的BroadcastReceiver,使得不同进程能够接收和响应特定的广播事件。 2. **Messenger**: Messenger是一种轻量级的IPC方案,适用于服务和服务之间的通信。它基于Handler和Message机制,...
在Android开发中,Messenger是一种轻量级的跨进程通信(IPC, Inter-Process Communication)机制,主要用于服务(Service)之间或者应用组件与服务之间的通信。本教程将介绍如何使用Messenger来实现在不同进程间的...
在这个“进程间通信Messenger”示例中,我们将深入探讨如何使用Android的Messenger服务来实现简单的IPC。 Messenger是Android提供的一种轻量级的IPC机制,主要用于在客户端和服务端之间传递消息。它基于AIDL...
总结来说,虽然AIDL提供了更全面的IPC功能,但针对简单的需求,使用Messenger可以更快地实现跨进程通信。开发者应根据实际需求选择合适的通信方式。在实际开发中,理解并熟练掌握这两种方法,有助于提高代码的可维护...