Android 深入理解AIDL进程间通信
前言
关于AIDL的资料,层出不穷,但是能让人简单明了理解的文章不多,那么我们就自己撸一遍,清晰明了的理解一下AIDL的原理。
准备
在理解AIDL原理之前,先写一个简单的使用AIDL进行进程间通信的例子,根据这个例子来由浅及深的理解AIDL。
先来定义实体类:UserBean.java
注意:如果要在AIDL中使用实体类,实体类必须要实现序列化接口,这里实现的是Android自带的Parcelable接口
package com.t9.news.Model;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by dai
* Created time 2018/5/11
* function:com.t9.news.Model
*/
public class UserBean implements Parcelable{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
protected UserBean(Parcel in) {
age = in.readInt();
name = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(age);
dest.writeString(name);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<UserBean> CREATOR = new Creator<UserBean>() {
@Override
public UserBean createFromParcel(Parcel in) {
return new UserBean(in);
}
@Override
public UserBean[] newArray(int size) {
return new UserBean[size];
}
};
}
声明好了实体类,就需要额外在AIDL中声明实体类
// UserBean.aidl
package com.t9.news.Model;
parcelable UserBean;
在AIDL 中使用实体类
// IMyAidlInterface.aidl
package com.t9.news;
// Declare any non-default types here with import statements
import com.t9.news.Model.UserBean;
interface IUser {
List<UserBean> getUser();
void addUser(in UserBean user);
}
看一下项目的结构
然后Build 一下 Project,结束之后就生成了Binder代码,来看看Binder代码生成的位置
这时候可以点开看一下这个类,十有八九会被吓到,先不去管它,稍后再来分析。
来声明一个Service:
package com.t9.news;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import android.util.Log;
import com.t9.news.Model.UserBean;
import java.util.ArrayList;
import java.util.List;
/**
* Created by dai
* Created time 2018/5/11
* function:com.t9.news
*/
public class MyService extends Service {
private String TAG = this.