您的位置:首页 > 大数据 > 人工智能

使用AS开发AIDL程序(1)

2015-12-30 18:53 561 查看
安卓中的进程间通信是使用Binder完成的,所以想要了解进程间通信必须先要理解什么是Binder,Android中Binder是一个类它实现了IBinder接口,是进程间通信的媒介,它的大致原理就是:当Activity调用
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传递的对象也都是可序列化的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: