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(); } } });
写点击写入按钮,然后点击读出按钮,就可以看到有气泡弹出来了,显示刚才写入的数据.

浙公网安备 33010602011771号