android使用AIDL进程间通信遇到的一个小问题

在练习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!…………../

猜你喜欢

转载自blog.csdn.net/qq_23057645/article/details/68067775