Activity与Service通信之信使(Messenger)

原创 2016年06月01日 16:34:44
一、通信原理
       Messenger翻译过来指的是信使,它引用了一个Handler对象,别人可以通过Messenger向它发送消息(使用mMessenger.send(Message msg)方法)。该类允许跨进程间基于Message通信,在服务端使用Handler创建一个 Messenger,客户端只要获得这个服务端的Messenger对象就可以与服务端通信了。
      使用步骤:           

                (1). 在Server端创建信使对象。

               mMessenger = new Messenger(mHandler)

        (2). Server端的onBind()方法返回一个binder对象。

               return mMessenger.getBinder();

        (3). Client端使用bindService()绑定Server端,通过public void onServiceConnected(ComponentName name, IBinder service)方法获取服务端的信使对象

        (4). Client端使用返回的binder对象得到Server端信使。

二、核心代码:

Service端:

public class MessengerService extends Service{

private static final int TIME = 1;
public static final int TEST = 0;
private int i = 0;
private Timer mTimer = null;

private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case TEST:
/** 获取客户端信使*/
cMessenger = msg.replyTo;
/** 执行计时器*/
mTimer.schedule(new MyTimerTask(), 1000,TIME * 1000);
break;
default:
break;
}
}
};

/** 服务端信使*/
private Messenger mMessenger = new Messenger(mHandler);
/** 客户端信使*/
private Messenger cMessenger = null;


@Override
public IBinder onBind(Intent intent) {
//派遣一个信使到服务端
return mMessenger.getBinder();
}

@Override
public void onCreate() {
super.onCreate();
mTimer = new Timer();
}


class MyTimerTask extends TimerTask {
@Override
public void run() {
if (i == 100) {
i = 0;
}
try {
Message message = Message.obtain(null, MessengerService.TEST,i, 0);
cMessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
i++;
}
}


@Override
public void onDestroy() {
super.onDestroy();
if(mTimer!=null){
mTimer.cancel();
mTimer = null;
}
}

}
Activity:

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import testndk.testservice.service.MessengerService;
public class MessageActivity extends Activity {

private boolean mIsBind;
private Button startBtn = null;
private Button stopBtn = null;
private TextView mTextView = null;
/** 从服务端获取的信使*/
private Messenger rMessenger = null;
/** 本地信使*/
private Messenger mMessenger = null;

private Intent intent = null;
private ProgressBar mProgressBar = null;

private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MessengerService.TEST:
int curLoad = msg.arg1;
mTextView.setText(curLoad+"%");
mProgressBar.setProgress(curLoad);
break;

default:
break;
}
}
};
private ServiceConnection serConn = new ServiceConnection() {

@Override
public void onServiceDisconnected(ComponentName name) {
rMessenger = null;
}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
rMessenger = new Messenger(service);//get the object of remote service
mMessenger = new Messenger(mHandler);//initial the object of local service
sendMessage();
}
};

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

intent = new Intent(this,MessengerService.class);
mProgressBar = (ProgressBar)findViewById(R.id.myProgressBar);
mProgressBar.setMax(100);
mTextView = (TextView)findViewById(R.id.loading_Tv);
startBtn = (Button)findViewById(R.id.start_Btn);
stopBtn = (Button)findViewById(R.id.stop_Btn);
startBtn.setOnClickListener(new ButtonClickListener());
stopBtn.setOnClickListener(new ButtonClickListener());

}


class ButtonClickListener implements OnClickListener {

@Override
public void onClick(View v) {
if (startBtn == v) {
mIsBind = bindService(intent, serConn, Context.BIND_AUTO_CREATE);//if bind success return true
} else if (stopBtn == v) {
if(mIsBind){
unbindService(serConn);
mIsBind = false;
}
}
}

}
/** 向服务端发信息*/
private void sendMessage() {
Message msg = Message.obtain(null, MessengerService.TEST);//MessengerService.TEST=0
msg.replyTo = mMessenger;
try {
rMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
注意:在配置文件中不要忘记注册服务:

<service android:name=".service.MessengerService">
</service>

源码下载地址:

http://download.csdn.net/detail/lu1024188315/9537991

效果:


版权声明:请尊重劳动成果,转载请注明来处:Abang的博客 http://blog.csdn.net/lu1024188315,如果您有不同意见,请尽情留言

用Messenger实现Activity与Service的信息交互

Android环境下,基于Messenger技术实现Activity与Service数据交换的实例程序参考
  • u013615937
  • u013615937
  • 2016年07月21日 14:58
  • 398

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

1 背景这个知识点是个low货,刚开始其实想在之前一篇文章《Android异步消息处理机制详解及源码分析》一文中作为一个知识点分析的,但是想了又想又觉得该放在后面进程间通信分析时再分析。然并卵,还是单...
  • yanbober
  • yanbober
  • 2015年09月13日 01:30
  • 7378

Android 基于Message的进程间通信 Messenger完全解析

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46858663; 本文出自:【张鸿洋的博客】 一、概述说到Andro...
  • lmj623565791
  • lmj623565791
  • 2015年07月23日 09:58
  • 58188

Android Service与Activity之间通信的几种方式

在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activ...
  • xiaanming
  • xiaanming
  • 2013年08月05日 00:11
  • 186951

Windows信使服务Messenger的安装

前段时间,想找个局域网软件,终于找到:LanHelper,安装好后功能还是很强大的,具体的不说了,这里主要说明通过LanHelper向局域网发送消息问题,其一须安装Messenger服务,我就没有安装...
  • rudyn
  • rudyn
  • 2014年05月07日 17:21
  • 1099

"activity和service通信"-三大方法之-使用Messenger(信使,信差)

信差 1.连接信差,负责接收Activity发送到Service的信息 2.Acitivity的新信差,负责让 连接信差 把自己发送给Service,让服务能收到信差并用来发送消息. 3.两个都有各自...
  • nzfxx
  • nzfxx
  • 2016年07月05日 17:30
  • 214

Android学习之Activity与Service进行通信的三种方式

Activity与Service进行通信的三种方式 第一种 简单通信 直接通过Intent进行传值,我们在启动一个Service的时候通过Intent的对象向Service进行传值,这种方式传...
  • qq_28468727
  • qq_28468727
  • 2016年08月07日 19:02
  • 14042

实现Activity和Service通信的几种方案

Service作为Android四大组件之一,一直默默无闻的在后台保证程序能正常运作。按照Google的定义,Service能在后台执行长时间的运行操作而不使用用户界面,它与后台线程的区别是它是整个程...
  • csdnYF
  • csdnYF
  • 2016年06月10日 20:31
  • 599

Service与Activity之间通信的几种方式

转载请注明地址http://blog.csdn.net/xiaanming/article/details/9750689 在Android中,Activity主要负责前台页面的展示,Service...
  • dj0379
  • dj0379
  • 2016年06月05日 14:55
  • 2743

Android Service与Activity双向通信的两种方式

本博客只讲述同一个进程中activity和Service的通信,进程间通信可以使用AIDL,后续博客更新.关于Service的认识service是一种组件,不是单独的线程或者进程,它属于UI线程,只不...
  • ethanhola
  • ethanhola
  • 2017年03月10日 00:37
  • 1530
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Activity与Service通信之信使(Messenger)
举报原因:
原因补充:

(最多只允许输入30个字)