背景
最近在仿Android版QQ,在实现消息传递的时候遇到一个问题:当service接收到一条聊天消息后,需要将该聊天消息传递给聊天界面,但怎么能是消息无延时的在service和Activity中传递呢?
一般的做法是使用广播,如在音乐播放器中播放进度的显示等,而使用广播发送消息时,会因为Android系统的影响而导致消息不能按时传送过去,因此研究了下使用接口无延时的传递。
原理
1、定义一个接口 如:ReceiveMsgInterface
2、在service中定义一个上述接口的对象,如receiveMsgInterface
3、在自定义IBinder类中定义一个赋值该receiveMsgInterface的方法,如onRecMessage(QQMessage msg);
4、当service接收到一个聊天消息后,调用receiveMsgInterface.onRecMessage(msg);
5、让聊天Activity实现receiveMsgInterface接口
6、当Activity通过bindService成功绑定该service后,调用2中IBinder中的赋值方法。
事例代码
Activity:
Intent service = new Intent(this, ReceiveMessageService.class);
conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e("onServiceDisconnected", name.toShortString());
}
//newsFragment是Activity中的一个fragment,且newsFragment实现RceiveMsgInterface接口
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
((MyBinder) service).addReceiverMessageInterface(newsFragment);
}
};
bindService(service, conn, BIND_AUTO_CREATE);
service:
public void receiverMessage(QQMessage msg) {
if (msg.type.equals(QQMessageType.MSG_TYPE_CHAT_P2P)) {
if (receiverMessageInterface!=null) {
receiverMessageInterface.onGetOneMessage(msg);
}
}
}
private receiveMsgInterface receiverMessageInterface;
public class MyBinder extends Binder {
public void addReceiverMessageInterface(receiveMsgInterfacermInterface){
receiverMessageInterface = rmInterface;
}
}
NewsFragment:
public class NewsFragment extends BaseFragment implements receiveMsgInterface{
xxxx;
@Override
public void onGetOneMessage(QQMessage msg) {
Message message = Message.obtain();
message.what =2;
message.obj=msg;
handler.sendMessage(message);
}
}