静默加载 2017-06-30 03:28 采纳率: 0%
浏览 3516
已结题

activity绑定Service成功时ServiceConnection的回调问题?

Activity绑定Service时ServiceConnection回调onServiceConnected传过来的IBinder对象,为什么相同进程下是Binder对象,不同进程下是BinderProxy对象。

 private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d(TAG, "IBinder.class.Name : " + service.getClass().getName());
            mService = new Messenger(service);
            Message msg = Message.obtain();
            Bundle data = new Bundle();
            String msgString = "hello ,this is client.";
            data.putString("msg", msgString);
            msg.setData(data);
            msg.replyTo = clientHandler;
            try {
                mService.send(msg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
  • 写回答

3条回答 默认 最新

  • 蚂蚁冲锋队 2017-06-30 05:45
    关注

    首先android的进程间通信采用的是IPC机制,IPC的主角就是Binder,整个通信机制在设计上是采用了代理模式来实现。
    比如:A(客户端)进程要调用B(服务)进程的一个方法funcB(),
    这个时候A并不能直接去访问B中的方法(出于数据保护,进程间是不允许直接通信的,IPC利用了共享内存来实现通信的)。
    IPC的大致思路是:
    A将这个请求委托给客户端的Binder代理,
    进而将请求转给BinderDriver,
    再将请求给服务端的Binder代理,
    最后通过Binder代理调用B中的funcB()。

    如果不去考虑中间的过程,客户端调用远程服务(跨进程)的时候,都是获得一个远程服务在本地的代理BinderProxy对象。
    通过该对象实现RPC的调用。

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器