Binder常用方法介绍

1.DESCRIPTOR
Binder的唯一标识,一般用Binder的类名表示

2.asInterface(android.os.IBinder obj)
将服务端的对象转换成客户端的AIDL接口类型的对象,这种转换过程是区分进程的,如果客户端和服务端在同一进程,那么此方法返回的是服务端的Stub对象本身,否则返回的是系统封装后的Stub.proxy对象

3.asBinder
此方法返回当前Binder对象

4.onTransact
此方法运行在服务端的Binder线程池中当客户端发起跨进程请求时,会通过系统底层封装后交由此方法处理。服务端通过code可以确定客户端所请求的目标方法是什么,然后从data中取出目标方法所需的参数,再执行目标方法,执行完毕后,就向reply中写入返回的值(如果方法有返回值),返回false那么客户端会请求失败

5.AIDL支持的数据类型
基本数据类型、String和CharSequence、ArrayList、HashMap、Parcelable、AIDL
注意:如果AIDL文件中用到了自定义的Parcelable对象,那么必须新建一个和它同名的AIDL文件,并在其中声明它为parcelable类型(例如: parcelable Book),除此之外,AIDL中除了基本类型,其它类型的参数必须标上方向:in(输入型参数)、out(输出型参数)或者inout(输入输出型参数)
例如(void addBook(in Book book);),最后非常重要的一点就是读取序列化对象要按照写入的顺序读取

6.远程服务端Service的实现
创建Service
创建一个Binder对象并在onBind中返回
(例如: Binder mBinder = new IBookManager.Stub(){} )、CopyOnWriteArrayList和ConcurrentHashMap(支持并发读写)
XML中注册这个Service,因为这个Service是运行在独立的进程,它和客户端的Activity不在同一个进程中,这样就构成了进程间通信的场景。
(Service添加:android:process=”:remote”)

7.客户端的实现
绑定远程服务,绑定成功后将服务端返回的Binder对象转换成AIDL接口,然后通过这个接口取调用服务端的远程方法
绑定服务

// 绑定服务
Intent intent = new Intent(this, BookManagerService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

解绑服务

unbindService(mConnection);

远程服务接口

private ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // 服务断开连接

        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // 获取
            IBookManager bookManager = IBookManager.Stub.asInterface(service);

    };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值