美文网首页
Android AIDL相关

Android AIDL相关

作者: 梁佳凝 | 来源:发表于2022-12-07 15:25 被阅读0次

    一、AIDL

    AIDL(Android Interface Definition Language)是一种接口定义语言,编译器通过*.aidl文件的描述信息生成符合通信协议的Java代码,我们无需自己去写这段繁杂的代码,只需要在需要的时候调用即可。

    在aidl生成的java代码中

    比如有aidl文件:

    package com.scott.aidl;

    interface IPerson{

        String greet(String someone);

    }

    生成的代码:

    public interface IPerson extends android.os.IInterface {

     // Stub类是继承于Binder类的

      public  static  abstract  class  Stub  extends  android.os.Binder  implements com.scott.aidl.IPerson {

      //asInterface方法

         public static com.scott.aidl.IPerson asInterface(android.os.IBinder obj) {

                if ((obj == null)) {

                    return null;

                }

                android.os.IInterface iin = (android.os.IInterface) obj.queryLocalInterface(DESCRIPTOR);

                if (((iin != null) && (iin instanceof com.scott.aidl.IPerson))) {

                    return ((com.scott.aidl.IPerson) iin);

                }

                return new com.scott.aidl.IPerson.Stub.Proxy(obj);

            }

     }

    private  static  class  Proxy  implements  com.scott.aidl.IPerson {

    }

    }

    1、Stub类

    Stub类是继承于Binder类的,也就是说Stub实例就是Binder实例。

    2、Stub.asInterface(IBinder obj) 函数的作用

    如果客户端和服务端在同一个进程下,那么asInterface()将返回Stub对象本身,否则返回Stub.Proxy对象。

    也就是说asInterface()返回的对象有两种可能(实际上有三种,还有一种是null),Stub和Stub.Proxy。

        如果在同一个进程下的话,那么asInterface()将返回服务端的Stub对象本身,因为此时根本不需要跨进称通信,那么直接调用Stub对象的接口就可以了,返回的实现就是服务端的Stub实现,也就是根本没有跨进程通信;

        如果不是同一个进程,那么asInterface()返回是Stub.Proxy对象,该对象持有着远程的Binder引用,因为现在需要跨进程通信,所以如果调用Stub.Proxy的接口的话,那么它们都将是IPC调用,它会通过调用transact方法去与服务端通信。

    参考:理解Aidl中Stub和Stub.Proxy

    https://blog.csdn.net/scnuxisan225/article/details/49970217

    相关文章

      网友评论

          本文标题:Android AIDL相关

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