android进阶-AIDL之自定义数据类型
2019-06-01 本文已影响2人
return_toLife
系列文章
AIDL的基本使用
AIDL之自定义数据类型
AIDL之重连方法-待
AIDL之接口注册/解注册-待
AIDL之连接池-待
知识点
- aidl使用自定义类型传递数据
一、aidl使用自定义类型传递数据
- 定义自定义数据类型并实现
Pracelable
接口
public class AIDLBook implements Parcelable {
public String name;
public int id;
//实现接口过程省略
....
....
....
}
- 创建自定义数据类型的AIDL文件,并添加实现了Pracelable的类
// AIDLBook.aidl
package com.returntolife.jjcode.mydemolist.bean;
// Declare any non-default types here with import statements
parcelable AIDLBook;
这里创建AIDL对应数据类型的时候,一定要注意包名的路径要与java文件的路径一致,如demo中所示:
image.png
- 在需要使用到该类型的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();
}
-
后面的过程就和之前第一篇AIDL的基本使用的使用一致
-
其他注意事项
如果在同进程中使用自定义数据类型AIDL进行通信,其传递的数据对象内存地址是一致的;
而如果像Demo中修改了service的进程号来模拟跨进程的时候,每次getBook()回来的对象地址都是不一样的,这个一定要特别注意,在后面讲解注册接口与解注册接口也会涉及到
另外,setBook()和getBook()方法是运行在binder线程中的,所以我们如果担心耗时问题,往往是放在子线程中调用aidl接口的方法
总结
aidl所提供的基本类型数据往往是不够我们开发中所用的,而自定义数据类型我们就要多注意对象的地址,避免引用问题,另外还有就是接口的调用要分清是否是运行在Binder线程中,避免出现方法耗时而导致应用出现ANR或者卡顿问题