Android 初识AIDL,rust移动端跨平台开发
作者:互联网
进程需要将其对象分解成操作系统能够识别的原语,并将对象编组成跨越边界的对象。
编写执行这一编组操作的代码是一项繁琐的工作,因此 Android 会使用 AIDL 来处理。
通过这种机制,我们只需要写好 aidl 接口文件,编译时系统会帮我们生成 Binder 接口。
简而言之,我们需要打包我们实体类的同时写一个aidl接口文件。
官方文档定义:
使用AIDL时会对内存进行读取,所以经常使用会造成程序变慢,所以不要过多使用
当只使用IPC,不用多线程并使用多个应用程序时,只使用binder就行了
而只有用IPC,不用多线程时,只使用message就好了
AIDL有必要用于使用IPC,处理多线程并且在多个应用程序间共享程序
-
JAVA的默认基本数据类型(String,int。。。 short除外)
-
List和Map
-
其它的AIDL接口
-
实现Parcelable的实体类
eworld/article/details/80830269)使用AIDL步骤
- 创建aidl
①创建实体类并实现Parcelable接口
②新建aidl文件,在其下面创建aidl的映射文件和接口文件
③通过build后生成binder的java文件
- 服务端
①创建service,在其中创建上面生成binder的实例,实现接口定义的方法
②在onBind()中返回
- 客户端
①实现ServiceConnection接口,在其中拿到AIDL类
②用bindService()绑定service
③使用aidl中的操作
AIDL实例:
(先演示一个小的)
服务端做出了一个A+B的功能,而客户端没有这个功能的时候他要去服务端调用这个功能。
首先在创建IMyaidl文件
// IMyaidl.aidl
package com.rikka.myaidl2;
// Declare any non-default types here with import statements
interface IMyaidl {
/**
-
Demonstrates some basic types that you can use as parameters
-
and return values in AIDL.
*/
int add(in int num1,in int num2);
}
因为只是个a+b的功能,所以没有实体类呀parcelable的说法
然后点个锤子make project产生myaidl
此时去服务端完成这个a+b的功能,新建myservice类
在其中实现onbind()和Stub()
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mIbinder;
}
private IBinder mIbinder = new IMyaidl.Stub() {
@Override
public int add(int num1, int num2) throws RemoteException {
return num1+num2;
}
};
}
这里的 new IMyaidl.Stub()函数的返回类型是Ibinder,它先实现IMyaidl里面的接口功能,然后向上转型为Ibinder类型,同时通过onBind()传出。这样做是为了当客户端的activity要去用这个服务端的这个功能时,客户端先要绑定这个service,这时候客户端就能得到这个IBinder了。
标签:AIDL,IMyaidl,int,aidl,跨平台,接口,Android,服务端 来源: https://blog.csdn.net/wa2231a/article/details/122716180