在练习AIDL进程间通信时候,传递了一组Person对象,activity中部分代码如下:
private void initPersons() {
//本类定义一个Person类的集合
List<Person> personList = new ArrayList<>();
Person person = new Person("","");
for (int i = 0; i < 10; i++){
//每次给Person两个属性赋不同的值
person.setName("第"+i+"个人");
person.setSex("性别"+i);
if(mAIDL != null) {
try {
//为两个集合中同时添加该Person对象
personList.add(person);
mAIDL.addPerson(person);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
//打印出本类中存储的Person集合的信息
for (Person person1 : personList) {
Log.e(TAG, "initPersons: "+person1.getName()+","+person1.getSex());
}
person = null;
}
点击事件中,初始化Person类集合,并从另一个线程中的Person集合中打印出集合中的信息。
@Override
public void onClick(View v) {
switch (v.getId()){
//开启服务
case R.id.start_service:
Intent intent = new Intent(this, MyService.class);
startService(intent);
bindService(intent, mConnection, BIND_AUTO_CREATE);
break;
//获得服务中Person类的信息
case R.id.get_service_list:
if(mAIDL != null){
try{
mAIDL.getData();
initPersons();
mAIDL.getList();
}catch (RemoteException e){
e.printStackTrace();
}
}
break;
}
}
另一个进程中的服务,内部类代码如下
class MyBinder extends IMyAidlInterface.Stub{
@Override
public void getData() throws RemoteException {
Log.e(TAG, "getData: 我是服务里的信息");
}
//添加Person对象
@Override
public void addPerson(Person p) throws RemoteException {
personList.add(p);
}
//打印Person类集合信息
@Override
public List<Person> getList() throws RemoteException {
for (Person person : personList) {
Log.e(TAG, "getList: "+person.getName()+","+person.getSex());
}
return personList;
}
}
运行程序后,发现打印信息,按理来说,因为只创建了一个Person对象。然后对其中的属性不断的进行更改赋值,再添加到集合中。应该最终打印出来的Person信息是一样的,都是最后更改的值。但是却发现服务端的Person类集合的信息是不一样的。说明每次Service里添加的对象是不一样的。
因为在进程间传递对象的时候,对对象进行了包裹化的写入操作,在进行解包裹化的时候,又进行了创建新的对象操作,所以每次传递的对象并不是同一个。
/…….后记: intent传对象,bundle传对象,效果是一样的,intent已经测试过。好玩。哈哈。Come on!…………../