进程间通信 基本类型可以使用Intent 但是如果传递对象的话 需要先将该对象 序列化。
一般将对象序列化有两种方式,
1.是java的方式 使用Serializable,这种比较简单 直接实现Serializable接口就行啦,但是一般需要在定义一个serialVersionUID参数,通过这个参数可以更好的实现反序列化。这种方式的开销比较大,因为要使用IO操作,一般也就在存储设备或者网络传输中使用。
2.是android的方式,使用Parcelable,这种是android的方式。这种相对复杂点。
首先定义一个需要序列化的类,该类实现parcelable接口。 重写
/**
* 将当前对象写入序列化结构中
* @param dest
* @param flags 有两种标识 1,当前对象需要作为返回值 返回 不能立即释放资源 几乎所有情况都是0
*/
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(BookId);
dest.writeString(BookName);
}
该方法 将对象的属性写入。
/**
* 返回当前对象的内容描述 如果含有文件描述符 返回1 否则返回0 几乎所有都是0
* @return
*/
@Override
public int describeContents() {
return 0;
}
protected Book(Parcel in) {
BookId = in.readInt();
BookName = 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];
}
};
将对象序列化以后 创建aidl文件 首先创建一个序列化同名的aidl文件
// Book.aidl
package com.example.a11077.librarydemo.aidl;
parcelable Book;
在创建一个需要实现方法的接口 aidl文件
// IBookManager.aidl
package com.example.a11077.librarydemo.aidl;
import com.example.a11077.librarydemo.aidl.Book;
// Declare any non-default types here with import statements
interface IBookManager {
List<Book> getBookList();
void addBook(in Book book);
}
创建另外一个进程中的服务
public class IService extends Service {
private ArrayList<Book> bookList;
@Nullable
@Override
public IBinder onBind(Intent intent) {
bookList=new ArrayList<>();
Log.d("myadil","绑定服务!");
return iBinder;
}
private IBinder iBinder=new IBookManager.Stub() {
@Override
public List<Book> getBookList() throws RemoteException {
return bookList;
}
@Override
public void addBook(Book book) throws RemoteException {
Log.d("bookID",book.getBookId()+"");
Log.d("bookName",book.getBookName()+"");
Log.d("booksize",bookList.size()+"");
bookList.add(book);
}
};
}
在另一个进程中 先绑定这个服务
Intent intent = new Intent(getActivity(), IService.class);
getActivity().bindService(intent,serviceConnection, Context.BIND_AUTO_CREATE);
创建上述中的seviceConnection
private ServiceConnection serviceConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//链接服务后返回拿到binder 转化AIDL在不同进程中会返回该代理
iBookManager = IBookManager.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
iBookManager=null;
}
};
在该进程中调用服务中实现的方法 即可在服务中调用传入的 序列化对象。即在内存中传递。
Book book = new Book((int) Math.random()*10,"测试");
try {
iBookManager.addBook(book);
} catch (RemoteException e) {
e.printStackTrace();
}