Android的IPC机制
Android的IPC机制上篇:简单介绍了Bundle、文件共享、Messenger的简单实现
中篇将详细介绍如何用 Kotlin
实现 Android 的 AIDL
下篇将简单介绍 ContentProvider
和 Socket
IPC(Inter-ProcessCommunication),含义为进程间通信或跨进程通信,是指两个不同进程之间进行数据交换的过程。
任何操作系统都有其相应的IPC机制,例如:Windows 上可以通过剪贴板、管道和邮槽等来进行进程间通信。Linux 上可以通过命名管道、共享内存、信号量等来进行进程间通信。Android 是一种基于 Linux 内核的移动操作系统,对于 Android 来说,它也有其特有的进程间通信方式。
四、AIDL
AIDL(Android Interface definition language),意为 Android 接口定义语言。我们可以利用 AIDL
定义客户端与服务端均认可的编程接口,以便二者在不同进程间进行通信。在 Android 中,一个进程通常无法访问另一个进程的内存。因此,为了进行通信,进程需将其对象分解成可供操作系统理解的原语,并将其编组为可供您操作的对象。Android 使用 AIDL
来处理,避免了编写执行该编组操作代码的繁琐操作。
AIDL 接口的调用是直接函数调用。实际情况的差异取决于调用是来自本地进程中的线程,还是远程进程中的线程。
1、AIDL支持的数据类型:
-
基本数据类型(int、long、char、boolean、double)
-
String 和 CharSequence
-
List : 只支持
ArrrayList
,且每个元素都必须是 AIDL 支持的元素 -
Map :只支持
HashMap
,且每个元素都必须是 AIDL 支持的元素 -
Parcelable :所有实现了 Parcelable 接口的对象
-
AIDL :所有的AIDL接口本身也可以在 AIDL 文件中使用
注意:
-
自定义的 Parcelable 对象和 AIDL 对象必须要显式 import 进来( eg :下文的 IBookManager.aidl)
-
如果在 AIDL 文件种使用到了自定义的 Parcelable 对象,必须要新建一个和它同名的 AIDL 文件,并声明它为 Parcelable 类型。(eg: Book.aidl)
2、AIDL的详细使用 [ Kotlin ]:
Book类使用 Parcelable 接口:
open class Book(var bookName: String?, var BookId: Int) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString(),
parcel.readInt()) {
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(bookName)
parcel.writeInt(BookId)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<Book> {
override fun createFromParcel(parcel: Parcel): Book {
return Book(parcel)
}
override fun newArray(size: Int): Array<Book?> {
return arrayOfNulls(size)
}
}
override fun toString(): String {
return " [BookName:$bookName ; BookId : $BookId ] "
}
}
2.1 AIDL接口的创建
// IBookManager.aidl
package com.example.aidltest