我们在开发过程中可能会使用Service后台服务,而后台服务可能需要与Activity之间进行数据交互。
这时我们可以假设Activity为客户端程序,而服务Service为服务端。
以下是信使(Messenger)对象的使用概要:
1. 服务端实现的一个处理器(Handler接口),这个处理器针对每次来自客户端的调用接收一次回调;
2、 客户端实现的一个处理器(Handler接口),这个处理器针对每次客户端向服务端发送消息
2. 这个处理器被用于创建一个信使对象(Messager)(这个信使对象要引用这个处理器);
3. 信使对象创建一个创建一个服务端从onBind()方法中返回给客户端的IBinder对象;
4. 客户端使用这个IBinder对象来实例化这个信使对象(信使引用了服务端的处理器),客户端使用这个信使给服务端发送Message对象;
5. 服务端在它的处理器(Handler)的handleMessage()方法中依次接收每个Message对象
客户端程序:
package com.example.testservice;
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.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener {
Messenger mService = null;
private Button button;
private int index=1;
//将Handler与Messenger绑定
final Messenger mMessenger = new Messenger(new IncomingHandler());
private ServiceConnection connection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
}
/*
* 当服务端与客户端绑定成功后会调用此方法 service为服务端传递过来的Messenger对象(non-Javadoc)
* 绑定成功后需要将客户端的Handler接口通过Messenger发送到服务端
* 以便服务端向客户端发消息
*/
public void onServiceConnected(ComponentName name, IBinder service) {
mService = new Messenger(service);
Message message = Message.obtain();
message.what=index;
message.replyTo = mMessenger;
try {
mService.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(this);
Intent intent = new Intent(this, MyService.class);
//绑定Service
bindService(intent, connection, Context.BIND_AUTO_CREATE);
}
public void onClick(View v) {
Message message = Message.obtain();
message.what=index;
try {
/*
* 向服务端发消息,
*
*/
mService.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
//此Handler接口主要处理来自服务端的发送消息
class IncomingHandler extends Handler{
public void handleMessage(Message msg) {
}
}
}
服务端程序
package com.example.testservice;
import java.util.ArrayList;
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 MyService extends Service {
/*
* 客户端的Messenger集合
* 之所以为集合,是因为一个服务端可能对应多个客户端
*/
ArrayList<Messenger> mClients = new ArrayList<Messenger>();
/**
* 服务端Messenger信使
*/
final Messenger mMessenger = new Messenger(new IncomingHandler());
public void onCreate() {
super.onCreate();
}
public void onDestroy() {
super.onDestroy();
}
/*
* 接收来自客户端的消息
*/
class IncomingHandler extends Handler {
public void handleMessage(Message msg) {
Log.e("handleMessage", "handleMessage");
switch (msg.what) {
case 1:
Log.e("11111111111", "11111111111");
mClients.add(msg.replyTo);
break;
case 2:
break;
}
}
}
/*
* (non-Javadoc)
* @see android.app.Service#onBind(android.content.Intent)
* 将服务端的Messeager返回给客户端
*/
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
}