Android---AIDL-IPC通信
2017-06-18 本文已影响30人
this_is_for_u
参考资料http://liuwangshu.cn/application/ipc/3-aidl.html
创建AIDL文件
image.pngIBookManager.aidl
package megvii.ipc;
//使用了Book类,这个类实现了Parcelable,需要import进来
import megvii.ipc.Book;
//所在包包名应该与应用包名一致
interface IBookManager {
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
List<Book>getBook();
void addBook(in Book book);
}
package megvii.ipc;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by wangzhiqiang on 2017/6/18.
*/
public class Book implements Parcelable {
String book;
String des;
public Book(String book, String des){
this.book = book;
this.des = des;
}
public Book(Parcel in){
book = in.readString();
des = in.readString();
}
public static final Creator<Book> CREATOR = new Creator<Book>() {
@Override
public Book createFromParcel(Parcel source) {
return new Book(source);
}
@Override
public Book[] newArray(int size) {
return new Book[size];
}
};
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(book);
dest.writeString(des);
}
@Override
public int describeContents() {
return 0;
}
}
package megvii.ipc;
parcelable Book;
//要创建Book.aidl,声明Book实现了parceable接口
//声明完所有aidl接口并写完Book.java后重新编译项目,就会生成与aidl相对应的接口文件
image.png
package megvii.ipc;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* Created by wangzhiqiang on 2017/6/18.
*/
public class AIDLService extends Service {
private CopyOnWriteArrayList<Book> mBook = new CopyOnWriteArrayList<>();
private Binder mBinder = new IBookManager.Stub(){
@Override
public void addBook(Book book) throws RemoteException {
mBook.add(book);
}
@Override
public List<Book> getBook() throws RemoteException {
return mBook;
}
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
}
};
@Override
public void onCreate() {
super.onCreate();
mBook.add(new Book("1","2"));
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
private ServiceConnection aidlConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//将绑定成功后的Binder对象转换为aidl接口,通过这个接口调用远程服务端方法
IBookManager iBookManager = IBookManager.Stub.asInterface(service);
//绑定成功后创建新的Book然后调用服务端addBook方法添加,打印
Book book = new Book("nihao", "hello");
try{
iBookManager.addBook(book);
List<Book> mbook =iBookManager.getBook();
for (int i = 0; i < mbook.size(); i++){
Book bo = mbook.get(i);
Log.i(TAG, bo.book + "----" + bo.des);
}
}catch (RemoteException e){
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onDestroy() {
super.onDestroy();
// unbindService(mService);
unbindService(aidlConnection);
}
Intent intent = new Intent(MainActivity.this, AIDLService.class);
bindService(intent, aidlConnection, Context.BIND_AUTO_CREATE);
<service android:name=".AIDLService"
android:process=":aidlservice"/>