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,如果您有不同意见,请尽情留言

相关文章推荐

Activity与Service之间的通讯机制

进程内与服务通信 进程内与服务通信实际上就是通过bindService的方式与服务绑定,获取到通信中介Binder实例,然后通过调用这个实例的方法,完成对服务的各种操作。 下面来看具体代码演示: ...

Android中通过Messenger与Service实现进程间双向通信

Android中的Service和其调用者既可以在同一个App中,也可以在不同的App。如果Service在App1中,而调用Service的客户端在App2中,那么我们就可以用Service实现进程...

Service与Activity通信方式之Messenger(信使)

Service与Activity通信方式之Messenger(信使)Messenger

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

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

Android通信—信使的使用实现Activity与Service的通信

使用信使Messenger实现Activity和Service的通信。
  • zxm528
  • zxm528
  • 2016年05月07日 16:42
  • 311

Activity与Service间的通信:Messenger

Activity与Service间的通信主要是通过绑定服务来得到服务返回的Binder对象,通过这个Binder对象来和服务进行通信,这个Binder对象可以是Interface、AIDL和Messe...
  • TurinZ
  • TurinZ
  • 2016年08月11日 16:03
  • 86

通过messenger实现activity与service的相互通信

布局:
  • xzylx1
  • xzylx1
  • 2015年12月07日 18:00
  • 93

Activity与Service用Messenger通信

1.在Service中创建Messenger包装Handler引用 Service中的handler: Handler handler=new Handler(){ @Overrid...

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

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

Android进程间通信之--Messenger(信使)

Messenger在古代,信息的传输不够发达,信件的传递都是通过信使(Messenger)来完成的,信使把信件(Message)从一个地方送到另一个地方,然后用把另外一个地方的信件带回来。架构师们从这...
  • fhtabc
  • fhtabc
  • 2016年07月07日 21:19
  • 249
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Activity与Service通信之信使(Messenger)
举报原因:
原因补充:

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