Android进程间通信之使用Messenger

Messenger,信使,可使用它进行进程间的通信,而Messenger对Service的请求采用队列的方式,因此它不支持多线程通信。

看看官方文档对于Messenger的解释:

Reference to a Handler, which others can use to send messages to it. This allows for the implementation of

message-based communication across processes, by creating a Messenger pointing to a Handler in one process,

and handing that Messenger to another process.

客户端和服务端可相互持有对方的Messenger来进行通信,下面我们来看看具体的实现。

在eclipse下创建两个工程,分别为客户端和服务端:

客户端的实现,创建客户端的Messenger,使用Messenger的构造方法指向一个handler实例,此handler用于处理服务端发过来的消息。

而客户端通过onServiceConnected获得服务端的Messenger,使用此Messenger给服务端发送消息,客户端的Messenger通过Message的replyTo传递给服务端。

 1 public class MainActivity extends Activity {
 2
 3     private static final String TAG = "--DEBUG--";
 4
 5     // 用于启动service的ACTION
 6     private static final String START_SERVER_ACTION = "com.young.server.START_SERVICE";
 7     private static final int WHAT_ON_TO_SERVICE = 1;
 8     private static final int WHAT_ON_TO_CLIENT = 2;
 9
10     private Button mBindBtn;
11     private boolean isBindService = false;
12
13     @Override
14     protected void onCreate(Bundle savedInstanceState) {
15         super.onCreate(savedInstanceState);
16         setContentView(R.layout.activity_main);
17         mBindBtn = (Button) findViewById(R.id.bind_service);
18         mBindBtn.setOnClickListener(new OnClickListener() {
19             @Override
20             public void onClick(View v) {
21                 bindService(new Intent(START_SERVER_ACTION), conn, Context.BIND_AUTO_CREATE);
22             }
23         });
24     }
25
26     // client端Handler,用于处理server端发来的消息
27     private Handler mClientHandler = new Handler(new Callback() {
28         @Override
29         public boolean handleMessage(Message msg) {
30             switch (msg.what) {
31             case WHAT_ON_TO_CLIENT:
32                 Log.v(TAG, "客户端收到服务端发来的消息!");
33                 break;
34
35             default:
36                 break;
37             }
38             return false;
39         }
40     });
41
42     // client端Messenger
43     private Messenger mClientMessenger = new Messenger(mClientHandler);
44
45     private ServiceConnection conn = new ServiceConnection() {
46
47         @Override
48         public void onServiceDisconnected(ComponentName name) {
49             Log.v(TAG, "服务已断开");
50
51             isBindService = false;
52             mClientMessenger = null;
53         }
54
55         @Override
56         public void onServiceConnected(ComponentName name, IBinder service) {
57             Log.v(TAG, "服务已链接");
58
59             isBindService = true;
60             // 获得server端信使Messenger实例
61             Messenger serverMessenger = new Messenger(service);
62             // 向server端发送的消息
63             Message toServerMessage = Message.obtain(null, WHAT_ON_TO_SERVICE);
64             // 通过replyTo把client端的信使传递给service
65             toServerMessage.replyTo = mClientMessenger;
66             try {
67                 serverMessenger.send(toServerMessage);
68             } catch (RemoteException e) {
69                 e.printStackTrace();
70             }
71         }
72     };
73
74     protected void onStop() {
75         if (isBindService)
76             unbindService(conn);
77         super.onStop();
78     };
79 }

服务端Service的实现,服务端接收到客户端的消息以后,通过Message的replyTo取出客户端的Messenger,使用此Messenger给客户端发送消息,这就实现了进程之间的双向通信。

服务端通过Messenger的getBinder方法将IBinder对象返给客户端,用于共享服务端的Messenger。

 1 public class RemoteService extends Service {
 2     private static final String TAG = "--DEBUG--";
 3
 4     private static final int WHAT_ON_TO_SERVICE = 1;
 5     private static final int WHAT_ON_TO_CLIENT = 2;
 6
 7     // server端handler,用来处理client发来的消息
 8     private Handler mServerHandler = new Handler(new Callback() {
 9         @Override
10         public boolean handleMessage(Message msg) {
11             switch (msg.what) {
12             case WHAT_ON_TO_SERVICE:
13                 Log.v(TAG, "收到客户端发来的消息");
14                 // server端获得client端的信使Messenger
15                 Messenger clientMessenger = msg.replyTo;
16                 Message toClientMsg = Message.obtain(null, WHAT_ON_TO_CLIENT);
17                 try {
18                     // 使用客户端Messenger向客户端发送消息
19                     clientMessenger.send(toClientMsg);
20                 } catch (RemoteException e) {
21                     e.printStackTrace();
22                 }
23                 break;
24
25             default:
26                 break;
27             }
28             return false;
29         }
30     });
31
32     // server端信使Messenger
33     private Messenger mServerMessenger = new Messenger(mServerHandler);
34
35     @Override
36     public IBinder onBind(Intent intent) {
37         return mServerMessenger.getBinder();
38     }

再来看看服务端service的声明,因为要在其他进程中启动service,所以设置android:exported为true,此外还为service加入启动了权限。

 1 <permission android:protectionLevel="normal" android:name="young.permission.START_SERVICE"></permission>
 2
 3 <service
 4     android:name="com.young.server.RemoteService"
 5     android:permission="young.permission.START_SERVICE"
 6     android:exported="true" >
 7     <intent-filter>
 8         <action android:name="com.young.server.START_SERVICE" />
 9     </intent-filter>
10 </service>

最后要在客户端添加相应的启动Service权限。

<uses-permission android:name="young.permission.START_SERVICE" />

程序运行后的结果,可以看到客户端和服务端都收到了对方发来的消息。

11-12 12:58:37.197: V/--DEBUG--(21322): 服务已链接
11-12 12:58:37.197: V/--DEBUG--(21268): 收到客户端发来的消息
11-12 12:58:37.197: V/--DEBUG--(21322): 客户端收到服务端发来的消息!

时间: 2024-10-24 02:52:21

Android进程间通信之使用Messenger的相关文章

Android进程间通信

如果想要进行IPC通信,一般写一个AIDL接口,再写一个Service子类,然后实现AIDL接口 当做IBinder返回给Activity界面层. 如果不想写AIDL接口文件,只是单线程中与Service进行通信 我们可以用Android写好的Messenger类来处理,一样能将消息传递给Service进行通信. 什么是aidl: aidl是 Android Interface definition language的缩写,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程

浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学习计划简要介绍了Android系统进程间通信机制Binder的总体架构,它由Client.Server.Service Manager和驱动程序Binder四个组件构成.本文着重介绍组件Service Manager,它是整个Binder机制的守护进程,用来管理

android进程间通信:使用AIDL

欢迎阅读本文,你能关注本文,你知道你需要进程间通信.需要AIDL(以及Binder),那么可以默认你对这些概念已经有了一些了解,你(大致)知道它们是什么,它们有什么用,所以为了节约大家的眼力和时间,在此我不复制粘贴网上泛滥的博客或者翻译冗长的android文档. 关于AIDL的介绍在文档:docs/guide/developing/tools/aidl.html 关于IBinder的介绍在文档:docs/reference/android/os/IBinder.html 以及Binder:doc

Android进程间通信之内部类作为事件监听器

在Android中,使用内部类可以在当前类里面发用改监听器类,因为监听器类是外部类的内部类,所以可以自由访问外部类的所有界面组件.以下是一个调用系统内部类实现短信发送的一个例子: SMS类: package com.example.msmlistener; import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; import android.telephony.Sm

饿了么开源项目Hermes:新颖巧妙易用的Android进程间通信IPC框架

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51464518 Android进程间通信IPC是比较高级的话题,很多Android程序员碰到IPC就觉得头疼,尤其是AIDL这类东西. 公司最近在研究DroidPlugin插件开发,DroidPlugin把每个子app都变成一个进程.这样的话子app和主app如果需要共享数据,就需要IPC.所以我开发了Hermes框架,让IPC变得非常简单优雅

初识Android进程间通信之----Binder机制

[转载请注明出处:http://blog.csdn.net/feiduclear_up/article/details/51405967 CSDN废墟的树] 前言 前面两篇博客分别介绍了Android进程间通信之AIDL的使用,以及使用AIDL传递复杂对象以及Bitmap对象.所谓AIDL:Android Interface Definition Language,是一种Android接口定义语言,用于编写Android进程间通信代码.也就是说AIDL只是一个实现进程间通信的一个工具,真正实现A

Android进程间通信与数据共享(ppt)

Android进程间通信与数据共享(ppt)

Android进程间通信之----Aidl传递对象

转载请注明出处 CSDN废墟的树 前言 有关Android进程间通信之Aidl编程的基本使用步骤已经在上一篇博客中有讲解,Android studio 下的aidl编程实现Android的夸进程间通信.上一篇博客中只是演示了怎么利用Aidl实现跨进程间传递Java基本类型,以及Aidl传递Bitamap对象.可能在一些场景下你需要跨进程传递一个对象,那么Aidl是否能传递一个对象呢?答案是肯定的,网上也有很多相关的资料,之所以写这篇博客:一是当作自己学习笔记咯,二是把自己遇到的问题分享出来. A

AIDL实现Android进程间通信实例

实现Android进程间通信实例有好几种方法: 1,AIDL 2,Broadcast 3,Intent 4,Content Provider 记录一下AIDL实现Android进程间通信的方式: Android的AIDL进程间通信实现步骤: 一:创建AIDL服务端:aidl文件,自动生成的接口java文件,服务service xxxInterface.aidl  (远程服务的接口定义) package com.example.aidltest; interface IMyAidlInterfac