Android AIDL <2>

今天接着昨天的那个demo进一步更新,这个AIDL在使用时就会有存在传递数据,一两个数据直接可以直接用方法参数传递就可以了,但是如果是一系列的数据,那就不方便了,一般可以这样做,新建一个实现Parcelable, Serializable的类,让它作为数据传递的载体,相当于一个新的数据集合,通过传递这个集合来传递一系列的数据.

步骤如下:在上一篇中的基础上,

<1> : 新建一个传递数据集合的载体类:在提供服务的APP工程下,下面我们保存3个数据参数,两个String型和一个int型:

package service;

import java.io.Serializable;
import java.util.Comparator;

import android.os.Parcel;
import android.os.Parcelable;

public class userData implements Parcelable, Serializable {

    private String username;
    private int userold;
    private String education;

    public userData() {

    }

    public userData(Parcel in) {
        // TODO Auto-generated constructor stub
        this.username = in.readString();
        this.userold = in.readInt();
        this.education = in.readString();
    }

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void writeToParcel(Parcel arg0, int arg1) {
        // TODO Auto-generated method stub
        arg0.writeString(username);
        arg0.writeInt(userold);
        arg0.writeString(education);
    }

    public void putUsername(String usrname) {
        this.username = usrname;
    }

    public void putOld(int userold) {
        this.userold = userold;
    }

    public void putEducation(String education) {
        this.education = education;
    }

    public String getUsername() {
        return this.username;
    }

    public int getOld() {
        return this.userold;
    }

    public String getEducation() {
        return this.education;
    }

    public static final Parcelable.Creator<userData> CREATOR = new Parcelable.Creator<userData>() {
        public userData createFromParcel(Parcel in) {
            return new userData(in);
        }

        public userData[] newArray(int size) {
            return new userData[size];
        }
    };

    private static final Comparator<userData> ACC_INFO_COMPARATOR = new Comparator<userData>() {
        @Override
        public int compare(userData data1, userData data2) {
            if (data1 != null && data2 != null) {

                String c1 = data1.getUsername();
                String c2 = data2.getUsername();

                if (c1 != null && c1.equals(c2)) {
                    return 1;
                } else
                    return -1;
            }

            return 0;
        }
    };

}

<2> 上面相当于新建了一个数据类型,那么需要两个APP都要认识它,并且使用它作为数据传递的载体,那么就要在提供服务的APP中再新建一个aidl的文件,在这个文件中提供一个userData的对象:useData.aidl

package service;
parcelable userData;

经过上方一顿挣扎,AIDL的传递数据的载体就差不多了,下面就是用这个载体传递数据了.

<3> 我们在aidluse.aidl文件中添加那个方法:getData(),setData()

package service;
import service.userData;
interface aidluse{
void show(String s);
String getInfor();
userData getData();
void setData(String username,int useold,String education);
}

<4> 如果不出意外,aidlService.java就会提醒实现上面两个方法:

public userData mPar = new userData();

然后实现两个方法如下:

@Override
        public userData getData() throws RemoteException {
            // TODO Auto-generated method stub
            return mPar;
        }

        @Override
        public void setData(String username, int userold, String education)
                throws RemoteException {
            // TODO Auto-generated method stub
            mPar.putUsername(username);
            mPar.putOld(userold);
            mPar.putEducation(education);

        }

好了,提供服务的APP端即搞定了,下面将在另外一个APP中使用它

<5> 重新拷贝userData.aidl,userData.java,aidluse.aidl到要使用的APP中,一定要记得拷贝哦.

<6> 在第二个APP中添加两个按钮,用于其写入数据和读取数据:

mWriteBtn = (Button) findViewById(R.id.write);
        mWriteBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                try {
                    mService.setData("zhibao.liu", 12, "hunan.university");
                } catch (RemoteException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

        });
        
        mReadBtn=(Button)findViewById(R.id.read);
        mReadBtn.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                try {
                    userData ud=mService.getData();
                    Toast.makeText(MainActivity.this, "username : "+ud.getUsername()+'\n'+"user old : " +ud.getOld()+'\n'+"user education : "+ud.getEducation(), Toast.LENGTH_SHORT).show();
                    
                } catch (RemoteException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
        });


写点击写入按钮,然后点击读出按钮,就可以看到有气泡弹出来了,显示刚才写入的数据.

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2014-03-28 18:47  MMLoveMeMM  阅读(222)  评论(0)    收藏  举报