- 自定义一个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"); } };
相关推荐
在标题“aidl传递复杂数据”中,我们讨论的是如何通过AIDL传输不仅仅是基本类型,还包括更复杂的对象,如ORMLite管理的数据库模型。 ORMLite(Object-Relational Mapping Lite)是一个轻量级的ORM库,用于简化...
当我们需要在不同的应用之间传递复杂的对象时,AIDL就显得尤为重要。本文将深入探讨如何利用AIDL在Android应用间传递对象。 首先,我们需要理解AIDL的基本概念。AIDL文件是一种定义接口的文本文件,它以.aidl为扩展...
"传递复杂数据类型的AIDL服务的客户端"是一个示例程序,展示了如何通过AIDL在服务与客户端之间传递包含复杂数据类型的数据。 在Android中,当需要在不同的应用程序组件之间交换数据时,由于进程隔离,直接调用是不...
系统会自动处理这些请求,包括序列化参数,传输,反序列化结果,确保数据在进程间的正确传输。 4. **服务端实现**: 在服务端,你需要实现AIDL接口,并在服务中注册这个实现。这样,服务就可以接收到客户端的调用并...
在这个"AIDL List传递 String传递(android studio)"的示例中,我们将深入探讨如何通过AIDL处理List数据和String数据的传递。 首先,让我们理解AIDL的基本结构。AIDL文件是一个文本文件,它定义了一个接口,这个...
在示例项目中,可能会包含复杂数据类型的使用,如自定义类或者数组。自定义类需要在AIDL文件中声明,以便系统能生成相应的序列化和反序列化代码。 4. **'in'、'out'和'intout'关键字** - `'in'`:表示参数从调用方...
- 当传递复杂对象时,确保对象实现了Parcelable接口,否则无法通过AIDL传输。 - `onServiceConnected()`可能不会立即调用,因此在调用服务方法之前需要检查服务是否已经连接。 - 服务连接后,需要在适当时候调用`...
在实践中,AIDL通常用于实现复杂的数据交换,比如在两个应用之间传输大对象或者处理复杂的业务逻辑。由于涉及进程间的通信,AIDL的使用需要注意性能问题,尽量减少数据传输量,优化接口设计。 总的来说,AIDL是...
**Android Interface Definition Language ...以上就是关于AIDL的一个简单示例,包括其基本概念、工作原理以及处理复杂数据类型的传递。理解并熟练运用AIDL,可以有效地实现Android应用间的高效、安全的进程间通信。
AIDL支持多种基本数据类型,如int、String等,以及数组、List、Map等复杂数据类型。但是需要注意,由于跨进程的数据传输,所有数据都必须是序列化的。对于自定义对象,需要在AIDL文件中导入并定义它们。 **并发与...
通过这个示例,开发者可以学习到如何在Android应用中实现跨进程通信,理解服务的生命周期管理,以及如何利用AIDL在不同进程中安全有效地传递数据。这在构建大型、复杂的应用时尤为重要,因为它们可能需要多个组件...
由于AIDL涉及到进程间通信,所以数据传输需要序列化。AIDL支持基本类型和`Parcelable`接口实现的对象。如果你需要传递自定义对象,这些对象必须实现`Parcelable`接口,以确保能够在进程间安全地传递。 ### 8. 性能...
1. AIDL仅支持基础数据类型和某些特定的复合类型,对于复杂的对象,你需要自己实现Parcelable或Serializable接口。 2. 跨进程调用会有一定的性能开销,因此应谨慎使用。 3. 服务端的生命周期管理很重要,避免内存...
**Android Interface Definition Language (AIDL) 代码示例解析** 在Android开发中,当需要在应用程序的不同组件之间进行跨进程通信(IPC,Inter-Process Communication)时,AIDL(Android Interface Definition ...
可以使用SSL/TLS加密通信,同时对传输的数据进行签名和验证,防止中间人攻击。 **四、文件`aidlmain.zip`和`aidlclient.zip`** 这两个文件很可能是示例项目,包含了一个服务端(aidlmain)和一个客户端...
这个接口定义了客户端和服务端可以调用的方法和传输的数据类型。 2. **数据类型**: AIDL支持基本的Java数据类型,如int、String等,以及自定义的Parcelable对象。如果需要传递更复杂的数据结构,需要实现Parcelable...
- 支持复杂数据类型的传递。 - 自动处理数据序列化和反序列化。 **限制**: - 增加了代码量和复杂性。 - 进程间通信有一定的性能开销。 - 不能直接传递非Parcelable对象,需手动实现Parcelable接口。 ### 6. 实战...
基础类型的传递指的是如int、String等简单数据类型的传输,这是AIDL最基础的功能。而"序列化对象的传递"则涉及到更复杂的数据结构,需要实现Parcelable或Serializable接口的自定义类,以便在进程间传递。最后,...
非`oneway`方法则需要在服务端处理完后回调客户端,这涉及到AIDL的序列化和反序列化机制,确保数据在进程间安全传输。 在这个Demo中,客户端和服务端的代码结构清晰,便于理解AIDL的工作流程。通过实际操作,开发者...
总结起来,Android AIDL是Android系统中实现进程间通信的重要工具,它简化了跨进程调用的复杂性,使得开发者可以方便地在不同的应用程序组件之间共享数据和服务。通过AIDL,我们可以构建更加复杂的Android应用程序,...