使用AS开发AIDL程序(1)
2015-12-30 18:53
561 查看
安卓中的进程间通信是使用Binder完成的,所以想要了解进程间通信必须先要理解什么是Binder,Android中Binder是一个类它实现了IBinder接口,是进程间通信的媒介,它的大致原理就是:当Activity调用
这里需要的
在
了解了Binder的作用和用法后我们来看看对象的序列化。
Android中提供了两种序列化对象的方法1实现
至于两者有什么区别主要是性能上的区别,实现
这里为什么要介绍Android中的序列化对象,是因为在进程间所传递的对象都是可序列化的。Binder传递的对象也都是可序列化的。
bindService的时候需要一个
ServiceConnection对象,在这个对象里能够拿到来自
Service传递过来的
Binder对象通过这个对象就可以调用另外一个进程里的方法了。具体的
binderSercvice方法如下:
Intent aidlIntent = new Intent(); aidlIntent.setClass(this, AidlSercice.class); boolean aidlBind = bindService(aidlIntent, aidlConnection, Context.BIND_AUTO_CREATE); LogUtil.log("-------aidlBind------->" + aidlBind);
这里需要的
aidlConnection对象如下:
ServiceConnection aidlConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { } @Override public void onServiceDisconnected(ComponentName name) { LogUtil.log("-------aidl--onServiceDisconnected----->"); } };
在
onServiceConnected()方法里的参数
IBinder service就是从Service里面传递过来的Binder对象。
了解了Binder的作用和用法后我们来看看对象的序列化。
Android中提供了两种序列化对象的方法1实现
Serializable接口,和实现
Parcelable接口。两种方法的区别是实现
Serializable很简单只要建个类实现这个接口就可以了不需要其他操作,甚至都不需要指定
serialVersionID(什么是serialVersionID?自行百度),而实现
Parcelable则比较复杂,需要复写
public void writeToParcel(Parcel dest, int flags)方法和
public int describeContents() { return 0; }方法,比如序列化一个
Book类,代码如下:
public class Book implements Parcelable { public Book(String bookName, String bookId) { this.bookName = bookName; this.bookId = bookId; } public String bookName; public String bookId; protected Book(Parcel in) { bookName = in.readString(); bookId = in.readString(); } public static final Creator<Book> CREATOR = new Creator<Book>() { @Override public Book createFromParcel(Parcel in) { return new Book(in); } @Override public Book[] newArray(int size) { return new Book[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(bookName); dest.writeString(bookId); } @Override public String toString() { return "Book{" + "bookName='" + bookName + '\'' + ", bookId='" + bookId + '\'' + '}'; } }
writeToParcel方法是序列化用的,通过
Parcel各种
write方法,它的flags参数只有两个取值0或1,几乎所有情况都是0。
CREATOR是实现反序列化用的,通过
Parcel各种
read完成,
describeContents方法返回的是对象的内容描述当为0是不需要内容描述,为1是需要内容描述,大部分情况都是返回0。
至于两者有什么区别主要是性能上的区别,实现
Serialable的方式比消耗性能不推荐使用,实现
Paricalabe的方式消耗比较少推荐使用这种,但是
Serialable这种方式很简单,所以根据情况而定。
这里为什么要介绍Android中的序列化对象,是因为在进程间所传递的对象都是可序列化的。Binder传递的对象也都是可序列化的。
相关文章推荐
- opencv_traincascade.exe用到的参数及解释
- Factorial Trailing Zeroes 阶乘的后边有几个0
- ld: library not found for -lPods clang: error: linker command failed with exit code 1 (use -v to see
- wait_event_interruptible 使用方法
- web.xml中<security-constraint>和四种认证类型
- Error Domain=NSURLErrorDomain Code=-999错误
- AIDL:进程间通信
- 采用airbnb的airpal和facebook的presto搭建数据平台所遇到的时区,权限问题
- 070 - Climbing Stairs
- POJ-2010 Moo University - Financial Aid
- 自定义View时,用到Paint Canvas的一些温故,只有想不到没有做不到(实例 1,画一个简单的Activity并且实现他能实现的)
- 自定义View时,用到Paint Canvas的一些温故,只有想不到没有做不到(实例 1,画一个简单的Activity并且实现他能实现的)
- Inotify测试(2):inotifywait 与 PyInotify 监控层级比较
- HA(high available)集群配置
- jraiser
- shrio 权限管理filterChainDefinitions过滤器配置
- IBM System 服务器做RAID步骤
- nonatomic, retain,weak,strong用法详解
- Raid3.0数据丢失怎么办
- AIDMA VS AISAS vs ISMAS 营销法则