- 浏览: 130552 次
- 性别:
- 来自: 鄂州
最新评论
-
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 31396官网这么说的 4.3 百度坐标为何有偏移? 国际 ... -
仿网易新闻App
2014-02-25 14:29 1661最近项目更换了新的设计,实现了左右滑动、下拉刷新的 ... -
Android图片压缩
2014-01-17 10:45 863比较简单,直接上代码 public static ... -
方便实用的下拉刷新控件,支持ScrollView、AbsListView
2013-07-10 11:23 20411最近要做一个下拉刷新的功能,网上找了很多例子,也看了一些开 ... -
Android根据指定的尺寸加载Bitmap
2013-04-15 15:28 10898因为图片的尺寸千差百异,要想加载不同的图片,又要保证不影响整 ... -
Wifi层次结构状态机(一)
2012-03-06 13:32 1787Android2.3中Wifi的状态都是在WifiStateT ... -
来电上报流程
2011-07-26 15:26 1491最近项目在做一个双模手机,我负责电话框架层的移植,因此把2.3 ... -
Android MediaPlayer的生命周期
2011-06-27 16:46 1490Android MediaPlayer 的生 ... -
AsyncQueryHandler的理解
2011-06-20 19:42 7880每天进步一点点之AsyncQueryHandler学习 As ... -
TabHost学习总结
2011-06-17 17:31 6505需求: Android自带的TabHost为橫向的,而且样式 ... -
Phone去电请求及响应(framework层)
2011-06-02 16:58 1897打电话请求流程 1.进入键盘界面(TwelvekeyDiale ... -
去电流程
2011-05-27 17:10 1296去电流程: 广播:action="android.i ... -
Android Aidl机制
2011-05-27 14:44 2353Aidl机制提供进程间传递对象。 当然在进程间传递对象也可以使 ... -
转:android Menu理解
2011-05-12 20:56 2508学了较长时间的android. 有些东西都习以为常,不愿意去深 ... -
Android中如何调用其它应用
2011-05-05 19:40 1786每天进步一点点 Android中如何调用其它应用 如:我 ... -
ContentProvider
2011-04-29 17:14 1205每天进步一点 MyContentProvider extend ... -
AutoCompleteTextView
2011-04-29 16:54 1147每天成长一点 AutoCompleteTextView的适配器 ...
相关推荐
实现简单的Messenger跨进程通信。
代码中包含两个应用程序,两者之间通信采用Messenger信使 使用方法:将下载下来的图片后缀名改为.zip,再解压即可得到源代码
AIDL、Messenger 两种方式实现跨进程通信,传递自定义数据
在介绍使用Messenger跨进程通信之前先要了解以下问题:为什么需要跨进程通信?只有有了需求才有学习的价值。我个人将不同进程简单的理解为不同的应用程序(当然也有例外,比如可以在同一个应用程序中开启两个或多个...
Android跨进程通信Binder、Messenger、AIDL汇总,代码包含服务端和客户端。一站式解决。
Messenger进程间通信,包括Service服务端代码和客户端代码;进程内部通信/进程间通信并且应答;
android 通过 Messenger 进行进程通信的 demo ,实现 Activity 和 service 的跨进程通信
IPC是Inter-Process Communication的缩写,意为进程间通信或者跨进程通信,是指两个进程进行数据交换的过程。本code是使用Messenger来完成进程间通信的,后续会继续上传别的通信方式Demo.
Messenger 进程间通信的使用讲解demo,内部含两个module 客户端和服务端,页面包含多个测试组间,一看就懂,使用前先构建下。
intent、 messenger 、aidl实现进程间通信 3个demo分别用客户端服务端实现进程间通信
android使用Messenger进程通信的例子,分为客户端和服务端,客户端发送一个消息给服务端,由服务器进行处理
通过 Messenger(信使) 实现进程将的通信,服务端具有信息反馈。
android跨进程通讯的几种实现:Messenger、ContentProvider、Binder、Socket、Binder连接池
轻量级进程间通信框架,基于 Messenger 实现。进程间传递数据不错的选择。
Android Messenger的使用,实现跨进程的通信,初学,大家有啥问题,多多指教。
这是一个简单进程间通信Messenger demo
1. 前言 提到的进程间通信(IPC:Inter-Process Communication),在Android...后面两种可以跨进程通信,是基于Binder机制的通信方式。 2. 使用时机 在确定使用什么机制之前,首先了解应用场景。Android系统中,如果
Messenger 实现进程间通信 可以翻译为信使,通过它可以实现在不同进程中传递Message 对象。 是一种轻量级的 IPC 方案。 Messenger 底层是通过AIDL实现的。 一次处理一个请求,不存在并发情况。
Android跨进程IPC通信的常用例子,AIDL,Messenger,Binder
Messenger 可以翻译为信使,顾名思义,通过它可以实现在不同进程中传递 Message 对象,在 Message 中可以携带我们需要传递的数据,借此就可以实现数据在不同进程间的通信。 Messenger 底层实现 Messenger 是一种轻...