Messager

作者: TakeItEasyJQ | 来源:发表于2018-03-11 23:35 被阅读0次

不是用于并发,并且无法调用远程方法

  • Service中
    1、Service中创建一个Handler并用它来创建Messager对象
    2、在onBind()方法中返回此Messager对象的底层binder
  • Client中
    1、绑定Service后用service返回的IBindler对象创建Messager对象
    2、若想Service可以回应Client,则重复Service中的动作

Service

public class MessagerService extends Service{
    private static class MessageHandler extends Handler{
        public void handleMessage(Message msg){
            switch(msg.what){
                //获取到从Client发来的消息
                /*
                    调用msg . replyTo;获取到Messager对象来和Client联系起来
                    之后的操作为向Client发送回应
                    Client可以通过相同的方式获取到Service发送出去的消息
                */
                case MyContants.MSG_FROM_CLIENT :
                    Messager client=msg.replyTo;
                    Message replyMessage=Message . obtain(null , MyContants.MSG_FROM_SERVICE);
                    Bundle bundle=new Bundle();
                    bundle.putString("reply" , "ok I got");
                    replyMessage.setData(bundle);
                    try{
                        client.send(replyMessage);
                    }
                    break ;
                default :
                    break;
            }
        }
    }
    private final Messager mMessager =new Messager ( new MessagerHandler);
    //通过Handler对象创建Messager对象
    public IBinder onBind(Intent intent){
        return mMessagerr . getBinder();
        //返回IBinder对象
    }
}

Manifest中注册服务

Client中

public class MainActivity extends .....{
    private Messager mService;
    private ServiceConnection mconnection = new ServiceConnection(){
        public void onServiceConnected( ComponentName classname , IBinder service){
            /*
                此为Client像Service发送消息具体实现过程,
                1、获取Messager对象(Binder对象)messager
                2、创建Message、Bundle对象msg、data并写入消息于data中,以"msg"作为key;然后调用msg.sendData(data);
                3、调用messager . send(msg)像服务器发送此条Message
            */
            mService = new Messager(service); //是不是很眼熟,Binder对象
            Message message = Message.obtain( null , MyContains.MSG_FROM_CLIENT);
            Bundle data=new Bundle();
            data . putString("msg" , "hello , this is client");
            message.sentData(data);
            try{
                mService . send(message);
            }catch(Exception e){

            }
        }
    }
    protected void onCreate(Bundle savedInstanceState){
    //onCreate()中绑定
        Intent intent=new Intent(this , MessagerService.class);
        bindService(intent , mconnection , Context.BIND_AUTO_CREATE);
    }
    protected void onDestroy(){
    //onDestroy()中解除绑定
        unbindService(mconnection);
        super.onDestroy();
    }
}

msg.replyTo = mGetReplyMessager;

相关文章

  • Android中实现进程通信

    AIDL Messager ContentProvider Socket Bundle Messager http...

  • 简化的Messager类

    看MVVMLight的Messager源码,自己实现了一个简单的Messager类。Messager类可以在MVV...

  • Messager

    不是用于并发,并且无法调用远程方法 Service中1、Service中创建一个Handler并用它来创建Mess...

  • 今天上fb,显示姐夫49分钟前上线了

    英国伦敦13:30左右。 他通过了我的messager请求。

  • Android IPC机制

    跨进程有多种方式: 基于Binder的AIDL、Messager、ContentProvider 能够携带Bund...

  • IPC机制

    1,跨进程通信,有几种方式,AIDL,socket套接字,contentProvider,messager,共享文...

  • NJCTF2017-messager

    最近刚做了道利用canary泄漏地址的题,想着顺便把canary爆破的题也做做,于是找到了这题 题目在5555端口...

  • Android进程间通信

    一、android组件之间通过Bundle通信 二、文件共享 三、Messager 四、AIDL 五、Conten...

  • Messager 实现跨进程通信

    参考:https://blog.csdn.net/lmj623565791/article/details/470...

  • Messager与AIDL的区别

    1.Messenger的本质也是AIDL,只不过Messenger对其进行了封装,在操作的时候不用再写.aidl文...

网友评论

      本文标题:Messager

      本文链接:https://www.haomeiwen.com/subject/bkrgfftx.html