Android Service aidl分析

Android Service 代码地址

在介绍正文之前,我们先看看几个知识点进程、线程和Android中的进程间通讯(IPC)。

  • 线程:线程时CPU调度的最小单元,同时线程也是一种有限的系统资源。
  • 进程:进程一般表示一个执行单元,在PC和移动设备中一般可以表示一个程序或者应用(在一般情况下,一个应用程序是在同一进程中运行,但是也有可能一个应用有多个进程,比如:Android中可以在清单文件中为四大组件指定运行进程(process属性),而不是运行在默认进程。)。
  • Android中的进程间通讯方式
    • Bundle:通过Intent打开四大组件时,Bundle可以用来传递数据(四大组件之间传递,数据类型有限)
    • 文件共享:通过共享文件传递数据(不适合高并发,且进程之间的数据传递实时性不强)
    • AIDL方式:功能强大,支持并发和实时性,支持一对多传输(使用较为复杂)
    • Messenger:AIDL的一种简化形式(不支持并发,请求串行处理,且为一对一,数据类型有限,和Bundle一样)
    • ContentProvider:Android四大组件之一,强大的数据源处理能力,支持并发和一对多(主要用于对数据源的CURD操作)
    • Socket:套接字,功能强大,通过网络传输字节流数据,支持一对多并发实时通讯(实现较为复杂,主要用于网络数据交换)

在前面我们已经说过了使用AIDL进行IPC通讯,这篇文章主要说明一下我们使用aidl后缀时,系统帮我们做了哪些事情。我们根据以下 IRemoteBookBinder.aidl 文件来做分析:

interface IRemoteBookBinder {
    void addBookIn(in BookBean bookBean);

    void addBookOut(out BookBean bookBean);

    void addBookInOut(inout BookBean bookBean);

    List<BookBean> getBookList();
}

我们创建了 IRemoteBookBinder.aidl 文件,重新 build 后,Android studio会帮我们自动生成 IRemoteBookBinder.java 文件,Android Studio自动生成的java文件路径在 app\build\generated\aidl_source_output_dir\debug\out\包名 中。文件内容比较长,这里就不直接将代码完全粘贴出来了,在下面分步说明。下图为 IRemoteBookBinder.java 类组织图:

IRemoteBookBinder结构

强烈建议:在看具体分析时,结合Android Studio中自动生成的类来看,效果要好于查看贴出来的代码。

内部类 Default

public static class Default implements com.renj.service.aidl.IRemoteBookBinder {
    @Override
    public void addBookIn(com.renj.service.bean.BookBean bookBean) throws android.os.RemoteException {
    }

    @Override
    public void addBookOut(com.renj.service.bean.BookBean bookBean) throws android.os.RemoteException {
    }

    @Override
    public void addBookInOut(com.renj.service.bean.BookBean bookBean) throws android.os.RemoteException {
    }

    @Override
    public java.util.List<com.renj.service.bean.BookBean> getBookList() throws android.os.RemoteException {
        return null;
    }

    @Override
    public android.os.IBinder asBinder() {
        return null;
    }
}

该类实现了 IRemoteBookBinder 类,作为IRemoteBookBinder接口的默认实现,在实际中并无太多实际意义。

IRemoteBookBinder.aidl 文件中声明的方法

public void addBookIn(com.renj.service.bean.BookBean bookBean) throws android.os.RemoteException;

public void addBookOut(com.renj.service.bean.BookBean bookBean) throws android.os.RemoteException;

public void addBookInOut(com.renj.service.bean.BookBean bookBean) throws android.os.RemoteException;

public java.util.List<com.renj.service.bean.BookBean> getBookList() throws android.os.RemoteException;

这几个方法都是在 IRemoteBookBinder.aidl 进行了声明的,直接作为接口的声明方法,具体有子类实现。

内部类 Stub

public static abstract class Stub extends android.os.Binder implements com.renj.service
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值