Android Service的理论探讨与实践(五)之messenger的使用

前言

 在本系列第一篇写了服务的两种启动方式,其中之一是bindservice。对于bindservice需要提供一个IBinder在onBind()方法返回。有三种方法可以提供这个Ibinder.分别是

  1. 直接定义一个Binder子类,在onBind()中返回
  2. 使用Messenger
  3. 使用AIDL
     第一种在第一篇中已经讲过,今天探究下Messenger的特点和简单使用

正文

普通bindService和Messenger的区别
  • 普通bindservice只能在同一个进程里使用
  • Messenger可以在不同进程里使用,既可以进行进程间通讯
Messenger的使用
 先说下Messenger使用方法概括,然后结合代码示例验证:
  • 在Service中实现一个Handler,该Handler为客户端的每一次调用接受一个回调即handleMessage()方法
  • 该Handler用来创建一个Messenger对象,该Messenger对象是该Handler的一个引用
  • 上面创建的Messenger创建一个IBinder,并通过onBind()把该IBinder返回给客户端
  • 客户端用上面返回的IBinder去实例化一个Messenger对象,客户端用该Messenger给服务发送Message对象。
  • 在服务中心定义的Handler接收到客户端发送的Message对象来处理消息。 综上:使用Messenger,服务里没有像普通BinderService那样提供给客户端可调用的方法,而是客户端通过发送消息(Message)给服务的Handler进行通讯。
代码示例:

先按照上面所说的,写服务端代码完成代码,在代码中逐条注释了上面总结的几点

public class MessengerService extends Service {

    private MyHandler myHandler = new MyHandler();
    //在Service中实现一个Handler,该Handler为客户端的每一次调用接受一个回调即handleMessage()方法
    public class MyHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case 1:
                    Toast.makeText(getApplicationContext(),"我来自客户端",Toast.LENGTH_SHORT).show();
                    break;
                default:
                    super.handleMessage(msg);
            }

        }
    }
    //该Handler用来创建一个Messenger对象,该Messenger对象是该Handler的一个引用
    Messenger messenger = new Messenger(myHandler);
    public MessengerService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
       // 上面创建的Messenger创建一个IBinder,并通过onBind()把该IBinder返回给客户端
       return messenger.getBinder();
    }
}

然后客户端代码如下,在客户端bind成功后,立马给服务端发一个消息,服务端接收到消息后,弹出一个Toast:

public void bind(View v) {
        bindLocalService();
    }

    private void bindLocalService() {

        Intent intent = new Intent(this, MessengerService.class);


        bindService(intent, mSerConection, Context.BIND_AUTO_CREATE);

    }

    private ServiceConnection mSerConection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //客户端用上面返回的IBinder去实例化一个Messenger对象
            Messenger msger = new Messenger(service);
            //客户端用该Messenger给服务发送Message对象。
            Message msg = Message.obtain();
            msg.what = 1;
            try {
                msger.send(msg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.i(TAG, "取消bind");
        }
    };

 至此,对Messenger的探讨暂时到此,后面会研究下,Messgener客户端和服务端的双端通讯

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值