AIDL怎么使用自定义对象

这一部分资料很多,我一边看着艺术探索,一边看着博客也跟着来了一遍,但怎么都无法编译通过,各种各样的错误,找不到类,找不到字段,巴拉巴拉。我实在是很郁闷,这么一个小小的东西怎么搞了2个小时?!然后查了一串串资料后我终于成功了!看到编译通过那一刻我就决定写一篇文章把它记下来,再也不摔在这里!

1、创建对象并实现Parcelable,我们以Person类为例:
package com.example.servicetest;

import android.os.Parcel;
import android.os.Parcelable;

public class Person implements Parcelable {

    String name;

    int age;

    int sex;

    public Person(){

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.name);
        dest.writeInt(this.age);
        dest.writeInt(this.sex);
    }

    //注意:这个方法需要手动实现,自动生成工具不会生成。且各字段读取顺序应该与writeToParcel一致
    public void readFromParcel(Parcel source) {
        name = source.readString();
        age = source.readInt();
        sex = source.readInt();
    }


    protected Person(Parcel in) {
        this.name = in.readString();
        this.age = in.readInt();
        this.sex = in.readInt();
    }

    public static final Creator<Person> CREATOR = new Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel source) {
            return new Person(source);
        }

        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };
}

Parcelable接口的方法实现可以使用AS自动生成,但不包括readFromParcel方法。readFromParcel需要我们手动实现,否则无法编译通过。另外,readFromParcel各字段的读取顺序需要与writeToParcel一致。

2、新建与自定义对象同名的aidl文件,Person.aidl

在这里需要做两件事,一是声明对象为parcelable类型,注意大小写;二是必须手动import Person类,哪怕它们在同一个包下:

// Person.aidl
package com.example.servicetest;

//必须手动import
import com.example.servicetest.Person;

//parcelable首字母小写
parcelable Person;

这里踩坑了,如果在Java目录下新建了Person.java类,再新建Person.aidl类会发现失败了,AS告诉你它们同名了:

image.png

解决办法是先新建aidl文件,再新建Java文件。
或者新建Java文件的时候把它创建在aidl目录下,像这样:等aidl文件也创建成功后,可以把Java文件再挪出去到Java目录下就没问题了,我晕...

image.png
3、在AIDL接口文件内同样import我们自定义的对象:

所有使用自定义对象的aidl文件都应该手动import它。

// PersonAIDL.aidl
package com.example.servicetest;

import com.example.servicetest.Person;

// Declare any non-default types here with import statements

interface PersonAIDL {

    String getName();

    //in out inout只可用于非基础类型,
    void setNameIn(in Person name);
    void setNameOut(out Person name);
    void setNameInOut(inout Person name);
}

然后build一下,你会发现失败了,报错大致是,找不到这个自定义类。我已经疯了,查资料,没有问题,emmm...再查
然后!

4、最后一步,在build.gradle文件中添加如下代码

位置在android 标签内,这应该与aidl文件的结构相关,话说这么重要的一步操作那些高赞文章怎么都不说呢,非让人家掉进去一次,不过也记得格外清楚了,哎

    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']
        }
    }

踩了无数坑之后,终于编译通过了!一个小小的自定义对象居然这么艰辛!所以学东西一定要动手,眼睛是看不出这么多坑的,而且要记录,不然还会掉进去,到时候再一波一波的搜索解决方案可是有点费事儿了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容