- 《Android Service基础》
- 《Android Service回调和配置》
- 《Android Service aidl使用及进阶》
- 《Android Service更多知识》
- 《Android 中的 IntentService 类详解》
- 《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
类组织图:
强烈建议:在看具体分析时,结合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.