使用bindService完成IPC进程间通信(在同一个APP内
2018-08-23 本文已影响9人
Jowney
AIDL从创建到使用:
1、本文假设你已经知道
- bindService创建流程
- 如何创建一个子进程
- AIDL是什么
- 序列化对象
2、假设这样的场景:在同一个应用的子进程中Service负责数据库(里面有一个Student表,表里有年龄、姓名两个字段)的操作,父进程的Activity该如何添加、修改、删除、查找数据。如何实现?
- 第一步 创建Student类文件
public class Student implements Parcelable {
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.name);
dest.writeInt(this.age);
}
public Student() {
}
protected Student(Parcel in) {
this.name = in.readString();
this.age = in.readInt();
}
public static final Creator<Student> CREATOR = new Creator<Student>() {
@Override
public Student createFromParcel(Parcel source) {
return new Student(source);
}
@Override
public Student[] newArray(int size) {
return new Student[size];
}
};
}
第二步
创建实体类Student的AIDL文件
编译器自动生成一个aidl文件夹,并根据你刚才在java文件夹下创建aidl文件的路径,生成一个相同的路径来保存该aidl文件。
打开Student.aidl文件,如图声明该实体类。
- 第三步
创建IStudentManager.aidl文件,该文件里面主要是声明方法,如下图
注意里面用到了Student实体类,需要手动导包。
- 第四步
编译项目,然后在如下图的路径中生成了 IStudentManager.java这个接口文件。
这个文件就是实现IPC的关键
第五步
在Service中实现 IStudentManager.Sub
public class MyNewBinderService extends Service {
private static final String TAG = "MyNewBinderService";
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new IStudentManager.Stub() {
@Override
public void setStudent(String name, int age) throws RemoteException {
Log.i(TAG, "setStudent: name:"+name+" age:"+age);
}
@Override
public Student getStudent() throws RemoteException {
return new Student();
}
};
}
}
第六步
在Activity中绑定该Service
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
IStudentManager myBinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this,MyNewBinderService.class);
bindService(intent,new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = IStudentManager.Stub.asInterface(service) ;
try {
myBinder.setStudent("JJ",24);
Log.i(TAG, "onServiceConnected: name:" + myBinder.getStudent().getName()+"age:"+ myBinder.getStudent().getAge());
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
},BIND_AUTO_CREATE);
}
@Override
protected void onResume() {
super.onResume();
}
}