面试题总结

本文详细阐述了Handler的工作原理,涉及其组成部分以及Looper的作用。同时介绍了AIDL(AndroidInterfaceDefinitionLanguage)的原理,特别是如何通过Binder实现进程间的跨空间通信,以及在Service中通过Ibinder和Proxy进行远程方法调用的过程。
摘要由CSDN通过智能技术生成

1:谈一下handler的原理

handler主要有4个组成部分,分别是:

Message,MessageQueue,Handler,Looper

Message用来存放数据

MessageQueue是一个消息队列,用来存取Message

Handler负责发送和获取数据

Looper是一个循环,用来不断查看在MessageQueue中是否有新的Message进来

2:handler的作用

最大的作用就是异步处理消息,因为handler是在主线程创建,因此子线程通过handler发送的消息会被handler在主线程中使用,这样就实现了异步消息的处理

2:谈一下AIDL原理

默认支持的数据类型包括:
1.Java中的八种基本数据类型,包括byte、short、int、long、float、double、boolean、char;
2.String类型、CharSequence类型;
3.List类型:List中的所有元素必须是AIDL支持的类型之一,或者是一个其他AIDL生成的接口,或者是定义的parcelable(下文关于这个会有详解)。List可以使用泛型;
4.Map类型:Map中的所有元素必须是AIDL支持的类型之一,或者是一个其他AIDL生成的接口,或者是定义的parcelable。Map是不支持泛型的;
5.定向tag:out in
6.序列化以后的实体类

原理

简单来说,AIDL 就是定义一个接口,客户端(调用端)通过 bindService 来与远程服务端建立一个连接,在该连接建立时会将返回一个 IBinder 对象,该对象是服务端 Binder 的 BinderProxy。在建立连接时,客户端通过 asInterface 函数将该 BinderProxy 对象包装成本地的 Proxy,并赋值给Proxy类的 mRemote 字段,本地通过 mRemote 即可调用远程方法。

说到aidl不得不提到binder,Android进程分为用户空间和内核空间,因为用户空间互不连通,因此进程间不可通讯,如果想进程间通讯就需要用到binder,binder可以为用户空间在内核空间开辟一个空间,通过这个共享的内核空间,用户空间之间就可以通讯了,也就是进程之间就可以通讯了。

那么aidl中是如何使用binder的呢?首先Service的onBind方法提供一个Ibinder

@Override
    public IBinder onBind(Intent intent) {
        GwmLog.d(TAG,"onBind");
        return mMediaControlImpl.getRemoteControls();
    }

这个Ibinder我们给它提供一个aidl文件中的stub,这个stub继承了binder,因此stub具有binder的功能

public static abstract class Stub extends android.os.Binder implements com.gwm.app.media.common.aidl.ITransportControls
{
......
}

客户端bindService的时候,通过可以通过Ibinder获取到一个Stub.Proxy

IMyAidlInterface mService = IMyAidlInterface.Stub.asInterface((IBinder) service);

Stub.Proxy为服务端Stub的代理,又因为服务端Stub具有binder的功能,binder又具有跨进程通讯功能,因此客户端可以通过Stub.Proxy去调用service中方法

public static com.gwm.app.media.common.aidl.ITransportControls asInterface(android.os.IBinder obj)
{
      if ((obj==null)) {
        return null;
      }
      android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
      if (((iin!=null)&&(iin instanceof com.gwm.app.media.common.aidl.ITransportControls))) {
        return ((com.gwm.app.media.common.aidl.ITransportControls)iin);
      }
      return new com.gwm.app.media.common.aidl.ITransportControls.Stub.Proxy(obj);
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值