- 自定义一个Person类,并实现Parcelable接口,必须实现这个接口,实现这个接口,必须有一个静态变量CREATOR,具体查看http://developer.android.com/reference/android/os/Parcelable.html
public class Person implements Parcelable { private Integer id; private String name; private String pass; public Person() { } public Person(Integer id, String name, String pass) { super(); this.id = id; this.name = name; this.pass = pass; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((pass == null) ? 0 : pass.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (pass == null) { if (other.pass != null) return false; } else if (!pass.equals(other.pass)) return false; return true; } // 实现Parcelable接口必须实现的方法 @Override public int describeContents() { return 0; } // 实现Parcelable接口必须实现的方法 @Override public void writeToParcel(Parcel dest, int flags) { //把该对象所包含的数据写到Parcel dest.writeInt(id); dest.writeString(name); dest.writeString(pass); } // 添加一个静态成员,名为CREATOR,该对象实现了Parcelable.Creator接口 public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() { @Override public Person createFromParcel(Parcel source) { // 从Parcel中读取数据,返回Person对象 return new Person(source.readInt() , source.readString() , source.readString()); } @Override public Person[] newArray(int size) { return new Person[size]; } };
- 定义一个Pet类,同样实现Parcelable接口
public class Pet implements Parcelable { private String name; private double weight; public Pet() { } public Pet(String name, double weight) { super(); this.name = name; this.weight = weight; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeDouble(weight); } // 添加一个静态成员,名为CREATOR,该对象实现了Parcelable.Creator接口 public static final Parcelable.Creator<Pet> CREATOR = new Parcelable.Creator<Pet>() { @Override public Pet createFromParcel(Parcel source) { // 从Parcel中读取数据,返回Person对象 return new Pet(source.readString() , source.readDouble()); } @Override public Pet[] newArray(int size) { return new Pet[size]; } }; @Override public String toString() { return "Pet [name=" + name + ", weight=" + weight + "]"; } }
- 定义Person.aidl和Pet.aidl
Person.aidl
parcelable Person;
Pet.aidl
parcelable Pet;
说明一下,在API Guides上是这样说的:
如你有一个类,并且想通过IPC interface,把它从一个进程发送到另一个进程,你的类必须实现 Parcelable
接口。支持 Parcelable
接口是非常重要的,因为它允许android系统分解这个对象成为原语( primitives,不知道翻译为原语对不对)。创建一个类来实现 Parcelable接口,必须做如下事情:
- 实现Parcelable接口
- 实现writeToParcel,方法,当前的对象将被写入一个Parcel.中。
- 定一个静态的变量,名字为CREATOR,他是一个实现了Parcelable.Creator 接口的一个对象。
- 最后,你需要创建一个.aidl文件来声明你的parcelable 类。其实就向上面的Person.aidl和Pet的aidl。
- 定义一个IPet.aidl,这个才是会生成java文件的AIDL
import com.example.aidlservice.Person; import com.example.aidlservice.Pet; interface IPet { List<Pet> getPets(in Person owner); }
注意,即使都在一个包中,也必须import,但是List就不需要Import。
- 定义Service类
public class ComplexAidlService extends Service { private ComplexBinder petBinder; private static Map<Person , List<Pet>> pets = new HashMap<Person , List<Pet>>(); static { // 初始化pets Map集合 ArrayList<Pet> list1 = new ArrayList<Pet>(); list1.add(new Pet("旺财" , 4.3)); list1.add(new Pet("来福" , 5.1)); pets.put(new Person(1, "sun" , "sun") , list1); ArrayList<Pet> list2 = new ArrayList<Pet>(); list2.add(new Pet("kitty" , 2.3)); list2.add(new Pet("garfield" , 3.1)); pets.put(new Person(2, "bai" , "bai") , list2); } @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return petBinder; } class ComplexBinder extends IPet.Stub{ @Override public List<Pet> getPets(Person owner) throws RemoteException { return pets.get(owner); } } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); petBinder = new ComplexBinder(); } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); } }
- Activity调用
private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { System.err.println("service is unconnected"); } @Override public void onServiceConnected(ComponentName name, IBinder service) { //System.err.println(ICat==null); petService = IPet.Stub.asInterface(service) ; System.err.println("service is connected"); } };
相关推荐
1、后台服务里是一个Android项目,是一个Service 后台服务 ...中通过AIDL获取简单数据与复杂数据 导入,分别运行(先运行后台服务,没有界面),在运行前台界面(先绑定,再点击中间按钮,最后点击解除绑定)
Aidl传递 复杂数据 基本代码事例
经典企业级AIDL进程间传输复杂数据的例子
这个里面涉及到ormlite的运用和aidl复制数据传递的结合,其中A是作为server,而b是client
传递复杂数据的AIDL服务 服务端的示例程序,这个是服务器端,与ch08_complextypeaidlclient工程配合使用
AIDL的示例以及自己简单实现一个AIDL ,code具有一定的参考意义,让人理解AIDL是怎么完成远程调用的
AIDL ,android跨进程通信示例,包括服务端,客户端,以及权限检测
android aidl activity 调用部分。
传递复杂数据的AIDL服务 客户端的示例程序,与ch08_complextypeaidl配合使用
Android AIDL 远程服务器使用示例,希望对web开发的朋友有所帮助
Android AIDL传输对象代码 Parcelable 在AIDL client的Activity中点击传输对象按钮查看日志,就会看到对象里面的内容
跨进程访问 aidl 客户端示例 本示例与 ch08_aidl 工程配合使用,运行时先运行ch08_aidl服务端,再运行本工程
AIDL简单的示例代码,主要是关于AIDL如何使用。https://blog.csdn.net/u013293125/article/details/77368261
aidl 简单demo 在两个应用间传输笔迹 包含aidl的简单运用和画布的简单实现
AIDL简单使用示例代码,关于如何使用AIDL https://blog.csdn.net/u013293125/article/details/77368261
Android下Aidl的使用,详细请参见博客:http://www.cnblogs.com/plokmju/p/android_Service_aidl_NormalType.html 和 http://www.cnblogs.com/plokmju/p/android_Service_aidl_CustomType.html
很简单的Aidl开发的示例,实现步骤的链接见压缩包里的txt说明文件。
aidl简单示例源码,对应博客地址:http://blog.csdn.net/chengjun77/article/details/50119913
IDEA创建AIDL示例
aidl 简单demo 在两个应用间传输笔迹 包含aidl的简单运用和画布的简单实现