`
jguangyou
  • 浏览: 375695 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

AIDL传输复杂数据示例

 
阅读更多
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接口,必须做如下事情:

  1. 实现Parcelable接口
  2. 实现writeToParcel,方法,当前的对象将被写入一个Parcel.中。
  3. 定一个静态的变量,名字为CREATOR,他是一个实现了Parcelable.Creator 接口的一个对象。
  4. 最后,你需要创建一个.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传递复杂数据”中,我们讨论的是如何通过AIDL传输不仅仅是基本类型,还包括更复杂的对象,如ORMLite管理的数据库模型。 ORMLite(Object-Relational Mapping Lite)是一个轻量级的ORM库,用于简化...

    Android aidl实现传递对象

    当我们需要在不同的应用之间传递复杂的对象时,AIDL就显得尤为重要。本文将深入探讨如何利用AIDL在Android应用间传递对象。 首先,我们需要理解AIDL的基本概念。AIDL文件是一种定义接口的文本文件,它以.aidl为扩展...

    传递复杂数据类型的AIDL服务的客户端

    "传递复杂数据类型的AIDL服务的客户端"是一个示例程序,展示了如何通过AIDL在服务与客户端之间传递包含复杂数据类型的数据。 在Android中,当需要在不同的应用程序组件之间交换数据时,由于进程隔离,直接调用是不...

    AIDL.rar示例

    系统会自动处理这些请求,包括序列化参数,传输,反序列化结果,确保数据在进程间的正确传输。 4. **服务端实现**: 在服务端,你需要实现AIDL接口,并在服务中注册这个实现。这样,服务就可以接收到客户端的调用并...

    AIDL List传递 String传递(android studio)

    在这个"AIDL List传递 String传递(android studio)"的示例中,我们将深入探讨如何通过AIDL处理List数据和String数据的传递。 首先,让我们理解AIDL的基本结构。AIDL文件是一个文本文件,它定义了一个接口,这个...

    android aidl

    在示例项目中,可能会包含复杂数据类型的使用,如自定义类或者数组。自定义类需要在AIDL文件中声明,以便系统能生成相应的序列化和反序列化代码。 4. **'in'、'out'和'intout'关键字** - `'in'`:表示参数从调用方...

    简单的aidl示例

    - 当传递复杂对象时,确保对象实现了Parcelable接口,否则无法通过AIDL传输。 - `onServiceConnected()`可能不会立即调用,因此在调用服务方法之前需要检查服务是否已经连接。 - 服务连接后,需要在适当时候调用`...

    AIDL使用示例Demo

    在实践中,AIDL通常用于实现复杂的数据交换,比如在两个应用之间传输大对象或者处理复杂的业务逻辑。由于涉及进程间的通信,AIDL的使用需要注意性能问题,尽量减少数据传输量,优化接口设计。 总的来说,AIDL是...

    AIDL简单示例

    **Android Interface Definition Language ...以上就是关于AIDL的一个简单示例,包括其基本概念、工作原理以及处理复杂数据类型的传递。理解并熟练运用AIDL,可以有效地实现Android应用间的高效、安全的进程间通信。

    AIDL示例-进程间通信

    AIDL支持多种基本数据类型,如int、String等,以及数组、List、Map等复杂数据类型。但是需要注意,由于跨进程的数据传输,所有数据都必须是序列化的。对于自定义对象,需要在AIDL文件中导入并定义它们。 **并发与...

    Android aidl使用示例源码

    通过这个示例,开发者可以学习到如何在Android应用中实现跨进程通信,理解服务的生命周期管理,以及如何利用AIDL在不同进程中安全有效地传递数据。这在构建大型、复杂的应用时尤为重要,因为它们可能需要多个组件...

    AIDLDemo,Android aidl 使用demo

    由于AIDL涉及到进程间通信,所以数据传输需要序列化。AIDL支持基本类型和`Parcelable`接口实现的对象。如果你需要传递自定义对象,这些对象必须实现`Parcelable`接口,以确保能够在进程间安全地传递。 ### 8. 性能...

    Android AIDL示例

    1. AIDL仅支持基础数据类型和某些特定的复合类型,对于复杂的对象,你需要自己实现Parcelable或Serializable接口。 2. 跨进程调用会有一定的性能开销,因此应谨慎使用。 3. 服务端的生命周期管理很重要,避免内存...

    aidl 代码示例

    **Android Interface Definition Language (AIDL) 代码示例解析** 在Android开发中,当需要在应用程序的不同组件之间进行跨进程通信(IPC,Inter-Process Communication)时,AIDL(Android Interface Definition ...

    android aidl 本地和aidl通信,远端和aidl

    可以使用SSL/TLS加密通信,同时对传输的数据进行签名和验证,防止中间人攻击。 **四、文件`aidlmain.zip`和`aidlclient.zip`** 这两个文件很可能是示例项目,包含了一个服务端(aidlmain)和一个客户端...

    AIDL_AidlService_android_

    这个接口定义了客户端和服务端可以调用的方法和传输的数据类型。 2. **数据类型**: AIDL支持基本的Java数据类型,如int、String等,以及自定义的Parcelable对象。如果需要传递更复杂的数据结构,需要实现Parcelable...

    IPC机制之AIDL

    - 支持复杂数据类型的传递。 - 自动处理数据序列化和反序列化。 **限制**: - 增加了代码量和复杂性。 - 进程间通信有一定的性能开销。 - 不能直接传递非Parcelable对象,需手动实现Parcelable接口。 ### 6. 实战...

    android Aidl 客户端和服务端Demo

    基础类型的传递指的是如int、String等简单数据类型的传输,这是AIDL最基础的功能。而"序列化对象的传递"则涉及到更复杂的数据结构,需要实现Parcelable或Serializable接口的自定义类,以便在进程间传递。最后,...

    Android AIDL 一个完整的Demo(包括服务端客户端2个工程)

    非`oneway`方法则需要在服务端处理完后回调客户端,这涉及到AIDL的序列化和反序列化机制,确保数据在进程间安全传输。 在这个Demo中,客户端和服务端的代码结构清晰,便于理解AIDL的工作流程。通过实际操作,开发者...

    android aidl dome下载

    总结起来,Android AIDL是Android系统中实现进程间通信的重要工具,它简化了跨进程调用的复杂性,使得开发者可以方便地在不同的应用程序组件之间共享数据和服务。通过AIDL,我们可以构建更加复杂的Android应用程序,...

Global site tag (gtag.js) - Google Analytics