AIDL的使用

简介: AIDL的使用

AIDL是安卓接口定义语言的简称,用于进程间通信 ,

AIDL默认支持的数据类型有:八种基本数据类型、String、List

如果要使用AIDL传递类对象,就必须让类实现Parcelable接口

文件结构如图所示

1.创建自定义类型

people.java

public class People implements Parcelable {
    String name;
    int age;
 
    public People(int age,String name){
        this.age = age;
        this.name = name;
    }
    public People(Parcel in) {
        name = in.readString();
        age = in.readInt();
    }
 
    public static final Creator<People> CREATOR = new Creator<People>() {
        @Override
        public People createFromParcel(Parcel in) {
            return new People(in);
        }
 
        @Override
        public People[] newArray(int size) {
            return new People[size];
        }
    };
 
    @Override
    public int describeContents() {
        return 0;
    }
 
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
    }
}

people.aidl

package com.example.aidl;
parcelable People;

IPeopleManager.aidl

package com.example.aidl;
 
// Declare any non-default types here with import statements
import com.example.aidl.People;
interface IPeopleManager {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);
 
    int getAge();
    String getName();
    void addPeople(in People people);
}

aidl方法传入自定义类对象时,in、out、inout必须写(aidl默认支持的类型不用写,默认且只能是in),否则报错。

.27-34: 'com.example.aidl.People' can be an out type, so you must declare it as in, out, or inout.

关于参数前的in、out和inout,跨进程时,in参数会把参数的内容传给aidl,但其改动不会同步到调用进程;out参数不会把参数的属性传给aidl(aidl获取的参数对象属性为空),但其改动会同步到调用进程;inout参数则是in和out的综合。不跨进程时,三者则是摆设

 

 

然后编译项目,如果提示找不到符号

 public void addPeople(com.example.aidl.People people) throws android.os.RemoteException;

则需要在build.gradle 的android标签下文件中加入如下代码

sourceSets {
        main {
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java.srcDirs = ['src/main/java', 'src/main/aidl']
            resources.srcDirs = ['src/main/java', 'src/main/aidl']
            aidl.srcDirs = ['src/main/aidl']
            res.srcDirs = ['src/main/res']
            assets.srcDirs = ['src/main/assets']
        }
    }


目录
相关文章
|
4天前
|
安全 Java 定位技术
Android 浅度解析:AIDL & Binder (1)
Android 浅度解析:AIDL & Binder (1)
41 0
|
4天前
AIDL中的in,out,inout
AIDL中的in,out,inout
12 0
|
4天前
AIDL原理
AIDL原理
10 0
|
4天前
|
Java 开发工具 Android开发
[Android AIDL] --- AIDL原理简析
[Android AIDL] --- AIDL原理简析
40 0
|
4天前
|
Java Android开发
[Android AIDL] --- AIDL工程搭建
[Android AIDL] --- AIDL工程搭建
24 0
|
12月前
|
Java 开发工具 Android开发
跨进程访问(AIDL服务)
跨进程访问(AIDL服务)
78 0
|
Java
【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )(三)
【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )(三)
132 0
|
Java
【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )(二)
【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )(二)
111 0
|
Java Android开发
|
Java 网络协议 安全
彻底弄懂binder与aidl
aidl与binder机制 为什么需要binder 没有用到binder之前,我们每个app生活在分配给自己的虚拟机和内存空间中,这样保证了app应用的安全,到很多时候我们需要用到跨进程通信(IPC),这时binder就为此而生。
2182 0