Android内核学习之Binder

一,Binder框架讲解
Binder是一种框架,这种架构提供了服务端接口,Binder驱动,客户端接口三个模块
服务端 一个Binder服务端实际上就是一个Binder类对象,该对象那个一旦创建,内部就会创建一个隐藏的线程,该线程就会接收Binder驱动发送的消息,收到消息后,会执行Binder中的onTransact()函数,并按照该函数的参数执行不同的服务代码,因此 ,要是先一个onTransact()方法
Binder驱动
Binder驱动,任意一个服务端Binder对象被创建时,同时会在Binder驱动创建一个mRemote对象,该对象的类型也是Binder类.客户端要访问远程服务时,都是通过mRemote对象.
程序客户端
客户端想要访问远程服务,必须要获取服务在Binder对象中对应的mRemote引用,至于如何获取,获得该mRemote对象后,就可以调用其transact()方法,而在Binder驱动中,mRemote对象也重载transact()方法
重载的内容主要包括:
- 以线程间消息通信的模式,向服务端发送客户端传递过来的参数
- 当挂起当前线程,当前线程正是客户端线程,并等待服务端线程执行完指定函数通知(notify).
- 接收到通知线程的通知,然后继续发送客户端线程,并返回到客户端代码区
Binder结构图
注意:客户端并不是直接调用了远程服务对应的BInder,而事实上则是通过Binder驱动进行中转.即存在两个Binder对象,一个是服务端的Binder对象,另一个则是Binder驱动中的Binder对象,所不同的是Binder驱动中的对象那个不会额外产生一个线程

二,程序设计的Service端
设计Service端一般都Android已经为你实现了,但是有实力的Android程序员可以按照自己实现一个Service,只要基于Binder类新建一个Service类即可,以下的BaseService代码就是继承了Binder类,并通过start(String filepath)和stop()方法来实现Service类


public class BaseService extends Binder{
   
    @Override
    protected boolean onTransact(int code, Parcel data, Parcel reply, int flags)
            throws RemoteException {
        // TODO Auto-generated method stub
        return super.onTransact(code, data, reply, flags);
    }
    public void start(String filepath) {

    }
    public void stop() {

    }
}

通过创建BaseService的实例来启动
使用DDMS工具查看Binder对应线程
可以看到DDMS的Threads中多了一个Binder_3线程,定义了服务类之后,就需要重写onTransact()方法,并在data变量中读出客户端传递的参数,start()方法需要变量filepath变量,客户端需要与服务者双方有一个约定.
客户端在传入的包裹data中放入第一个数据就是filepath变量,那么,onTransact()的代码就需要这么设计:

    @Override
    protected boolean onTransact(int code, Parcel data, Parcel reply, int flags)
            throws RemoteException {
        switch (code) {
        case 1000:
            data.enforceInterface("BaseService");
            String filepath=data.readString();
            start(filepath);
            break;

        default:
            break;
        }
        return super.onTransact(code, data, reply, flags);
    }

AIDL中onTransact()方法实现

@Override public boolean onTransact(int</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值