利用接口实现service与Activity消息传递

背景

最近在仿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 receiveMsgInterfacexxxx;
    @Override
    public void onGetOneMessage(QQMessage msg) {
        Message message = Message.obtain();
        message.what =2;
        message.obj=msg;
        handler.sendMessage(message);
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值