android studio AIDL使用方法。

来源:互联网 发布:阿里云公共dns 编辑:程序博客网 时间:2024/04/28 11:06

最近学习aidl,在as上遇到了问题,老是出现问题,这里总结一下aidl的用法。

因为例子中需要使用自定义类型作为传入参数,所以这篇文章基于此背景写的。

step one:
在你的src/main目录下新建一个aidl的文件夹,然后在aidl文件夹中新建一个包,注意,这的包名要完全等同于androidMainfest里面的包名,然后我们在其中初始化我们自定义的类型(Book),Book.aidl是Book类在AIDL中的生命,IBookManager是我们定义的一个接口。
结构如下:
这里写图片描述

step two:
我们需要在gradle里面添加如下的语句:

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

因为aidl文件我们初始化后,如果没有告诉as自定类型在哪里,它自己根本找不到,(这个白痴,让我弄了好久,吐槽一下)。

step three:
重新Build一下project就可以了,就有相关的信息出现在bulid/generated/source/aidl/debug里面了
如下:
这里写图片描述

最后生成的效果如下:

/* * This file is auto-generated.  DO NOT MODIFY. * Original file: /Users/linchen/Desktop/MyApplication/app/src/main/aidl/com/mytest/adiltest/BookManager.aidl */package com.mytest.adiltest;public interface BookManager extends android.os.IInterface {    /**     * Local-side IPC implementation stub class.     */    public static abstract class Stub extends android.os.Binder implements com.mytest.adiltest.BookManager {        private static final java.lang.String DESCRIPTOR = "com.mytest.adiltest.BookManager";        /**         * Construct the stub at attach it to the interface.         */        public Stub() {            this.attachInterface(this, DESCRIPTOR);        }        /**         * Cast an IBinder object into an com.mytest.adiltest.BookManager interface,         * generating a proxy if needed.         */        public static com.mytest.adiltest.BookManager asInterface(android.os.IBinder obj) {            if ((obj == null)) {                return null;            }            android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);            if (((iin != null) && (iin instanceof com.mytest.adiltest.BookManager))) {                return ((com.mytest.adiltest.BookManager) iin);            }            return new com.mytest.adiltest.BookManager.Stub.Proxy(obj);        }        @Override        public android.os.IBinder asBinder() {            return this;        }        @Override        public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {            switch (code) {                case INTERFACE_TRANSACTION: {                    reply.writeString(DESCRIPTOR);                    return true;                }                case TRANSACTION_getBookList: {                    data.enforceInterface(DESCRIPTOR);                    java.util.List<com.mytest.adiltest.Book> _result = this.getBookList();                    reply.writeNoException();                    reply.writeTypedList(_result);                    return true;                }                case TRANSACTION_addBook: {                    data.enforceInterface(DESCRIPTOR);                    com.mytest.adiltest.Book _arg0;                    if ((0 != data.readInt())) {                        _arg0 = com.mytest.adiltest.Book.CREATOR.createFromParcel(data);                    } else {                        _arg0 = null;                    }                    this.addBook(_arg0);                    reply.writeNoException();                    return true;                }            }            return super.onTransact(code, data, reply, flags);        }        private static class Proxy implements com.mytest.adiltest.BookManager {            private android.os.IBinder mRemote;            Proxy(android.os.IBinder remote) {                mRemote = remote;            }            @Override            public android.os.IBinder asBinder() {                return mRemote;            }            public java.lang.String getInterfaceDescriptor() {                return DESCRIPTOR;            }            @Override            public java.util.List<com.mytest.adiltest.Book> getBookList() throws android.os.RemoteException {                android.os.Parcel _data = android.os.Parcel.obtain();                android.os.Parcel _reply = android.os.Parcel.obtain();                java.util.List<com.mytest.adiltest.Book> _result;                try {                    _data.writeInterfaceToken(DESCRIPTOR);                    mRemote.transact(Stub.TRANSACTION_getBookList, _data, _reply, 0);                    _reply.readException();                    _result = _reply.createTypedArrayList(com.mytest.adiltest.Book.CREATOR);                } finally {                    _reply.recycle();                    _data.recycle();                }                return _result;            }            @Override            public void addBook(com.mytest.adiltest.Book book) throws android.os.RemoteException {                android.os.Parcel _data = android.os.Parcel.obtain();                android.os.Parcel _reply = android.os.Parcel.obtain();                try {                    _data.writeInterfaceToken(DESCRIPTOR);                    if ((book != null)) {                        _data.writeInt(1);                        book.writeToParcel(_data, 0);                    } else {                        _data.writeInt(0);                    }                    mRemote.transact(Stub.TRANSACTION_addBook, _data, _reply, 0);                    _reply.readException();                } finally {                    _reply.recycle();                    _data.recycle();                }            }        }        static final int TRANSACTION_getBookList = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);        static final int TRANSACTION_addBook = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);    }    public java.util.List<com.mytest.adiltest.Book> getBookList() throws android.os.RemoteException;    public void addBook(com.mytest.adiltest.Book book) throws android.os.RemoteException;}

参考文章:
http://www.android100.org/html/201507/15/165012.html
http://blog.csdn.net/wuyuxing24/article/details/46948961

0 0
原创粉丝点击