有时候service和activity之间需要比较复杂的交互,需要双向通信,这时候就可以使用messenger了
- 在service中定义handler类处理message
- 使用自定义的handler实例化messenger
- 在onbinder中返回messenger的binder引用
- 在activity中得到service的messenger引用
- 如果需要service向activity发送消息,在activity获得service的messenger后向service发送reply中有activity的messenger引用的message
service中主要代码
private final Messenger mMessenger = new Messenger(new IncomingHandler());
/**
* Handler of incoming messages from clients.
*/
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_SEND_NOTIFICATION:
int howManyConversations = msg.arg1 <= 0 ? 1 : msg.arg1;
int messagesPerConv = msg.arg2 <= 0 ? 1 : msg.arg2;
sendNotification(howManyConversations, messagesPerConv);
break;
default:
super.handleMessage(msg);
}
}
}
activity中
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder service) {
mService = new Messenger(service);
mBound = true;
setButtonsState(true);
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
mService = null;
mBound = false;
setButtonsState(false);
}
};