Service练习——通过Messenger(信使)来实现IPC通讯(Messenger底层使用AIDL实现)

通过Messenger(信使)来实现IPC通讯(Messenger底层使用AIDL实现)

步骤:

服务端
1、在Service中创建一个Handler对象,用于处理消息
2、在Service中创建一个Messenger对象,并绑定Handler
3、在onBind方法中通过Messenger.getBinder方法返回绑定的对象
客户端
4、通过bindService来绑定一个服务,在提供的ServiceConnection对象的onServiceConnected方法中,
通过IBinder参数来创建Messenger对象,这样客户端与服务端就使用同一个IBinder
5、客户端向服务端发送消息,通过Messenger的send方法发送一个Message对象
6、以上可实现客户端到服务端的单向通讯,如需要实现双向通讯:
(1)在客户端再创建一个Messenger对象,并绑定一个Handler来处理消息
(2)在向服务端发送消息对象(Message)时,使用replyTo属性指定服务端可向客户端回复消息的Messenger对象,
这样,服务端就可以利用replyTo向客户端发送消息。

新建一个服务端(Service)

 1 package com.example.service_messenges;
 2
 3 import android.annotation.SuppressLint;
 4 import android.app.Service;
 5 import android.content.Intent;
 6 import android.os.Handler;
 7 import android.os.IBinder;
 8 import android.os.Message;
 9 import android.os.Messenger;
10 import android.os.RemoteException;
11 import android.widget.Toast;
12
13 public class MessengesService extends Service {
14
15     public static final int SAY_MSG = 0x1;
16     // 创建一个信使对象,并绑定信使处理器,由信使处理器来处理
17     private Messenger m = new Messenger(new InComingHandler());
18
19     // 用来操作msg的handler
20     @SuppressLint("HandlerLeak")
21     class InComingHandler extends Handler {
22
23         @Override
24         public void handleMessage(Message msg) {
25             super.handleMessage(msg);
26             switch (msg.what) {
27             case SAY_MSG:
28                 String name = msg.obj.toString();
29                 Toast.makeText(MessengesService.this, "我是" + name + ",我为自己带盐",
30                         Toast.LENGTH_SHORT).show();
31                 // 当我需要返回一个值的时候就再写一个信件给信使
32
33                 Message m = Message.obtain();
34                 m.what = SAY_MSG;
35                 m.obj = "我是" + name + ",我为自己带盐";
36                 try {
37                     msg.replyTo.send(m);
38                 } catch (RemoteException e) {
39                     // TODO Auto-generated catch block
40                     e.printStackTrace();
41                 }
42                 break;
43
44             default:
45                 break;
46             }
47
48         }
49
50     }
51
52     // 绑定m
53     @Override
54     public IBinder onBind(Intent arg0) {
55         return m.getBinder();
56     }
57
58 }

然后在清单文件中进行注册

1  <service android:name="com.example.service_messenges.MessengesService"></service>

接着在客户端中

 1 package com.example.service_messenges;
 2
 3 import android.os.Bundle;
 4 import android.os.Handler;
 5 import android.os.IBinder;
 6 import android.os.Message;
 7 import android.os.Messenger;
 8 import android.os.RemoteException;
 9 import android.app.Activity;
10 import android.content.ComponentName;
11 import android.content.Context;
12 import android.content.Intent;
13 import android.content.ServiceConnection;
14 import android.view.View;
15 import android.widget.EditText;
16 import android.widget.Toast;
17
18 public class MainActivity extends Activity {
19
20     private Messenger m;
21     private boolean mBound = false;
22     private EditText et;
23
24     @Override
25     protected void onCreate(Bundle savedInstanceState) {
26         super.onCreate(savedInstanceState);
27         setContentView(R.layout.activity_main);
28         et = (EditText) findViewById(R.id.editText1);
29     }
30     private Handler handler=new Handler(){
31         public void handleMessage(Message msg){
32             switch (msg.what) {
33             case MessengesService.SAY_MSG:
34                 String info="这是传递来的→"+msg.obj.toString();
35                 Toast.makeText(MainActivity.this, info,Toast.LENGTH_SHORT).show();
36                 break;
37             default:
38                 break;
39             }
40         };
41     };
42     private Messenger mReplyTo = new Messenger(handler);
43
44     public void msgClick(View v) {
45         // 这样的效率高
46         Message msg = Message.obtain();
47         msg.what = MessengesService.SAY_MSG;
48         String name = et.getText().toString();
49         msg.obj = name;
50         msg.replyTo=mReplyTo;
51         try {
52             m.send(msg);
53         } catch (RemoteException e) {
54             e.printStackTrace();
55         }
56
57     }
58
59     private ServiceConnection conn = new ServiceConnection() {
60
61         @Override
62         public void onServiceDisconnected(ComponentName arg0) {
63             // 这里是失败了
64             mBound = false;
65             m = null;
66         }
67
68         @Override
69         public void onServiceConnected(ComponentName arg0, IBinder arg1) {
70             // 这里是成功了
71
72             m = new Messenger(arg1);
73         }
74     };
75
76     @Override
77     protected void onStart() {
78         super.onStart();
79
80         Intent intent = new Intent(this, MessengesService.class);
81         bindService(intent, conn, Context.BIND_AUTO_CREATE);
82         mBound = true;
83     }
84
85     @Override
86     protected void onStop() {
87         super.onStop();
88
89         if (mBound) {
90             mBound = false;
91             unbindService(conn);
92         }
93     }
94
95 }

总结:Service是一个应用程序组件,可以长时间在后台运行,不提供用户界面

   通过绑定(bind)一个服务来实现进程间的通讯(IPC通讯)

时间: 2024-10-11 22:56:59

Service练习——通过Messenger(信使)来实现IPC通讯(Messenger底层使用AIDL实现)的相关文章

Android应用进程间通信之Messenger信使使用及源码浅析

1 背景 这个知识点是个low货,刚开始其实想在之前一篇文章<Android异步消息处理机制详解及源码分析>一文中作为一个知识点分析的,但是想了又想又觉得该放在后面进程间通信分析时再分析.然并卵,还是单独拿出来写一篇分析一下吧. 提到Message和Handler其实大家都很熟悉,但是说到Messenger估计有些人还是不太常用的,更有甚者都能把Messenger拼写错误为Messager,以为是Message加了个r,当然,网络上对于Messenger的文章现在也很多了,但是个人分析总结总归

Android IPC之Messenger浅谈

之前写过一篇有关 IPC之AIDL浅谈的文章,详情请看Android IPC之AIDL浅谈.今天再来介绍另一种 IPC-Messenger. 一.概述. 首先看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 c

【Android】17.5 利用Messenger实现进程间通信(IPC)

分类:C#.Android.VS2015: 创建日期:2016-03-03 一.Messager类简介 本章前面曾经说过,要在Android上执行带服务的进程间通信(IPC),既可以用Messenger类来实现,也可以用更高级的AIDL技术来实现(AIDL:Android接口定义语言). 这一节我们学习首选的方案:用Messenger实现IPC的基本设计思路. IPC:进程间通信(Inter-process Communication). IPC with Service:带服务的进程间通信.

android 史上最简单易懂的跨进程通讯(Messenger)!

不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递message对象,在message中放入我们需要传递的数据你就可以实现跨进程通讯和传递数据.废话不多说,直接上代码. 首先是服务端: public class Ser extends Service{ @Override public IBinder onBind(Intent intent) {

Android的IPC机制(一)——AIDL的使用

综述 IPC(interprocess communication)是指进程间通信,也就是在两个进程间进行数据交互.不同的操作系统都有他们自己的一套IPC机制.例如在Linux操作系统中可以通过管道.信号量.消息队列.内存共享.套接字等进行进程间通信.那么在Android系统中我们可以通过Binder来进行进程间的通信.当然除了Binder我们还可以使用Socket来进行进程间的通信.  既然需要进程通信,那么就必须有多个进程.当然,在两个应用交互中必然出现多进程的情况.若是在一个应用中呢?我们

Android 进程间通信之Messenger

Android进程间通讯的方式 ? 当我们需要执行 IPC(进程间通信)时,一般有两种方式:AIDL和Messenger.关于AIDL的介绍请参看Android进程间通讯之AIDL.我们这里只介绍Messenger. ? 使用Messenger要比使用 AIDL 实现它更加简单,因为 Messenger 会将所有服务调用排入队列,而纯粹的 AIDL 接口会同时向服务发送多个请求,服务随后必须应对多线程处理.对于大多数应用,服务不需要执行多线程处理,因此使用 Messenger 可让服务一次处理一

Android Service初步学习的笔记

1.Service的应用场景 条件:a.并不依赖于用户可视化界面(不是绝对的,如前台service就是与notification界面结合使用的)   b.具有较长时间的运行特性. service的应用场景有很多,如: 当用户离开音乐应用时,Music playback以Service运行: 当后台文件正在下载时它以Service实现: Google应用维持一个Service来从网络中获取推送服务: 当一些特殊的数据同步需要进行时,Sync adapters以Service运行于后台: 活动壁纸以

Android系统中基于Binder的IPC流程框架分析

前言: Activity.Service.BroadcastReceiver.Content Provider是Android的四大应用程序组件,构成一个完整的应用程序的这些组件可以在同一个进程,也可以不在同一个进程,而当这些组件不在同一个进程,需要进行数据交互时就需要一种IPC(Inter-Process Communication)进程间通信机制来完成,而Binder就是提供了IPC功能的一个框架.实现IPC的整个Binder框架包含几个重要组成部分,它们分别是Binder Driver.C

Android Service IPC通信之Messenger机制

概述 之前我写过一篇博客介绍Service:Android Service全面解析,里面讲过如何实现Service的跨进程(IPC)通信,主要是通过编写AIDL接口文件来实现的.本篇我们来讲讲Service IPC通信的另外一种方式-Messenger. Messenger,也称为信使,通过它可以在不同的进程间传递message对象,在message中放入我们需要传递的数据你就可以实现跨进程通信和传递数据了.所以说Messenger机制是基于消息的跨进程通信方式. 可以看到,我们可以在客户端发送