android进阶-AIDL之自定义数据类型

系列文章

AIDL的基本使用
AIDL之自定义数据类型
AIDL之重连方法
AIDL之接口注册/解注册
AIDL之连接池

知识点

  1. aidl使用自定义类型传递数据

一、aidl使用自定义类型传递数据

  1. 定义自定义数据类型并实现Pracelable接口
public class AIDLBook implements Parcelable {

    public String name;
    public int id;
   //实现接口过程省略
   ....
   ....
   ....
}
  1. 创建自定义数据类型的AIDL文件,并添加实现了Pracelable的类
// AIDLBook.aidl
package com.returntolife.jjcode.mydemolist.bean;

// Declare any non-default types here with import statements
parcelable AIDLBook;

这里创建AIDL对应数据类型的时候,一定要注意包名的路径要与java文件的路径一致,如demo中所示:


6912282-1c8f469fe7ff5ddd.png
image.png
  1. 在需要使用到该类型的AIDL接口中导入该类型
// IPerson.aidl
package com.returntolife.jjcode.mydemolist;

// Declare any non-default types here with import statements
import com.returntolife.jjcode.mydemolist.bean.AIDLBook;

interface IPerson {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void  setName(String s);
    String  getName();

    void setBook(in AIDLBook book);
    AIDLBook getBook();
}
  1. 后面的过程就和之前第一篇AIDL的基本使用的使用一致

  2. 其他注意事项
    如果在同进程中使用自定义数据类型AIDL进行通信,其传递的数据对象内存地址是一致的;
    而如果像Demo中修改了service的进程号来模拟跨进程的时候,每次getBook()回来的对象地址都是不一样的,这个一定要特别注意,在后面讲解注册接口与解注册接口也会涉及到
    另外,setBook()和getBook()方法是运行在binder线程中的,所以我们如果担心耗时问题,往往是放在子线程中调用aidl接口的方法


总结

aidl所提供的基本类型数据往往是不够我们开发中所用的,而自定义数据类型我们就要多注意对象的地址,避免引用问题,另外还有就是接口的调用要分清是否是运行在Binder线程中,避免出现方法耗时而导致应用出现ANR或者卡顿问题

Demo地址

https://github.com/returntolife455/DemoList

转载于:https://www.jianshu.com/p/38465b40d9df

猜你喜欢

转载自blog.csdn.net/weixin_34144450/article/details/91191434