`

Android开发:什么是Parcel(2)

 
阅读更多

转自:http://blog.csdn.net/niu_gao/article/details/6453391

 

上回书解释了IBinder,这回详细解释一下Parcel,以下是对android sdk 文档的翻议:
Parcel是一个容器,它主要用于存储序列化数据,然后可以通过Binder在进程间传递这些数据(要了解为什么要序列化,请参考:http://blog.csdn.net/nkmnkm/archive/2011/05/28/6451699.aspx
。Parcel可以包含原始数据类型(用各种对应的方法写入,比如writeInt(),writeFloat()等),可以包含Parcelable对象,它还包含了一个活动的IBinder对象的引用,这个引用导致另一端接收到一个指向这个IBinder的代理IBinder。

注:Parcel不是一般目的的序列化机制。这个类被设计用于高性能的IPC传输。因此不适合把Parcel写入永久化存储中,因为Parcel中的数据类型的实现的改变会导致旧版的数据不可读。

  Parcel的一坨一坨的API用于解决不同类型数据的读写。这些函数们主要有六种类型。

1原始类

这类方法们主要读写原始数据类型。它们是:writeByte(byte), readByte(), writeDouble(double), readDouble(), writeFloat(float), readFloat(), writeInt(int), readInt(), writeLong(long), readLong(), writeString(String), readString(). 大多数其它数据的操作都是基于这些方法。

2原始数组类

这类方法用于读写原始数据组成的数组。在向数组写数据时先写入数组的长度再写入数据。读数组的方法可以将数据读到已存在的数组中,也可以创建并返回一个新数组。它们是:

  • writeBooleanArray(boolean[]), readBooleanArray(boolean[]), createBooleanArray()
    writeByteArray(byte[]), writeByteArray(byte[], int, int), readByteArray(byte[]), createByteArray()
    writeCharArray(char[]), readCharArray(char[]), createCharArray() 
    writeDoubleArray(double[]), readDoubleArray(double[]), createDoubleArray() 
    writeFloatArray(float[]), readFloatArray(float[]), createFloatArray() 
    writeIntArray(int[]), readIntArray(int[]), createIntArray() 
    writeLongArray(long[]), readLongArray(long[]), createLongArray() 
    writeStringArray(String[]), readStringArray(String[]), createStringArray(). 
    writeSparseBooleanArray(SparseBooleanArray), readSparseBooleanArray().

3 Parcelable类 
Parcelable为对象从Parcel中读写自己提供了极其高效的协议。你可以使用直接的方法 writeParcelable(Parcelable, int) 和 readParcelable(ClassLoader) 或 writeParcelableArray(T[], int) and readParcelableArray(ClassLoader) 进行读写。这些方法们把类的信息和数据都写入Parcel,以使将来能使用合适的类装载器重新构造类的实例。

还有一些方法提供了更高效的操作Parcelable们的途径,它们是:writeTypedArray(T[], int), writeTypedList(List), readTypedArray(T[], Parcelable.Creator) and readTypedList(List, Parcelable.Creator)。这些方法不会写入类的信息,取而代之的是:读取时必须能知道数据属于哪个类并传入正确的Parcelable.Creator来创建对象而不是直接构造新对象。(更加高效的读写单个Parcelable对象的方法是:直接调用Parcelable.writeToParcel()和Parcelable.Creator.createFromParcel())

4 Bundles类

Bundles是一种类型安全的Map型容器,可用于存储任何不同类型的数据。它具有很多对讀写数据的性能优化,并且它的类型安全机制避免了当把它的数据封送到Parcel中时由于类型错误引起的BUG的调试的麻烦,可以使用的方法为: writeBundle(Bundle), readBundle(), and readBundle(ClassLoader)。

5 活动对象类

Parcel的一个非同寻常的特性是读写活对象的能力。对于活动对象,它们的内容实际上并没有写入,而是仅写入了一个令牌来引用这个对象。当从Parcel中读取这个对象时,你不会获取一个新的对象实例,而是直接得到那个写入的对象。有两种活动对象可操作:

Binder对象。它是Android跨进程通讯的基础。这种对象可被写入Parcel,并在读取时你将得到原始的对象或一个代理对象(可以想象:在进程内时得到原始的对象,在进程间时得到代理对象)。可以使用的方法们是: writeStrongBinder(IBinder), writeStrongInterface(IInterface), readStrongBinder(), writeBinderArray(IBinder[]), readBinderArray(IBinder[]), createBinderArray(), writeBinderList(List), readBinderList(List), createBinderArrayList()。

FileDescriptor对象。它代表了原始的Linux文件描述符,它可以被写入Parcel并在读取时返回一个ParcelFileDescriptor对象用于操作原始的文件描述符。ParcelFileDescriptor是原始描述符的一个复制:对象和fd不同,但是都操作于同一文件流,使用同一个文件位置指针,等等。可以使用的方法是:writeFileDescriptor(FileDescriptor), readFileDescriptor()。

6无类型容器类

 

    一类final方法,用于读写标准的java容器类。这些方法们是:writeArray(Object[]), readArray(ClassLoader), writeList(List), readList(List, ClassLoader), readArrayList(ClassLoader), writeMap(Map), readMap(Map, ClassLoader), writeSparseArray(SparseArray), readSparseArray(ClassLoader)。

分享到:
评论

相关推荐

    Android中Parcel用法详解

    本文实例讲述了Android中Parcel用法。分享给大家供大家参考,具体如下: Android 中Parcel 的使用,他是一个存储基本数据类型和引用数据类型的容器,在andorid 中通过IBinder来绑定数据在进程间传递数据。 Parcel ...

    Android开发之Parcel机制实例分析

    在Android开发中,Parcel机制是一种专为高效IPC(Inter-Process Communication,进程间通信)设计的序列化和反序列化机制。与Java中的常规序列化不同,Parcel并不适用于持久化存储,而是专注于在进程间快速传递数据...

    parcel使用的demo

    在Android开发中,当你需要将一个复杂的对象传递到另一个Activity或服务时,Parcel提供了高效且便捷的方法。下面我们将深入探讨Parcel的使用,并通过"ObjectTranDemo"这个示例进行讲解。 首先,了解Parcel的基本...

    利用Kotlin如何实现Android开发中的Parcelable详解

    在Android开发中,Parcelable接口是用于对象序列化和反序列化的高效机制,常用于Activity、Fragment之间或者Intent中传递复杂数据。Kotlin虽然提供了许多便利的功能,但在实现Parcelable时仍存在一些挑战,尤其是在...

    binder例子

    virtual android::status_t onTransact(int code, const android::Parcel& data, android::Parcel* reply, int flags) override; }; ``` 2. 实现服务端(Service):服务端需要在生命周期内将Binder对象绑定到服务...

    用于在状态保存和恢复期间避免TransactionTooLargeException的Android库_Java_Kot.zip

    在Android开发中,状态保存和恢复是常见的需求,特别是在应对屏幕旋转、系统配置更改或应用被系统杀掉后重新启动等情况。然而,在处理这些场景时,开发者可能会遇到一个棘手的问题——`TransactionTooLargeException...

    parcel-sevices-android:用于包裹项目的 Android 应用程序

    开发语言主要使用了 Java,这是一款广泛应用于Android开发的强大编程语言。 一、Java在Android开发中的应用 Java 是 Android 应用开发的首选语言,它基于面向对象的编程模型,具有良好的跨平台兼容性。Android SDK ...

    xamarin学习笔记A17(安卓Parcel和IParcelable)

    总结来说,Xamarin Android开发中,通过实现IParcelable接口并利用Parcel对象,我们可以有效地在不同组件或进程间传递复杂的对象。这极大地扩展了Android应用程序的数据交互能力,特别是在需要跨进程通信的场景下,...

    Kotlin实现页面互相跳转和互相传值源代码

    Kotlin作为一种现代、类型安全且极其适合Android开发的编程语言,提供了简洁而高效的方式来处理这些任务。本篇文章将深入探讨如何使用Kotlin在Android中实现页面的互相跳转以及如何在跳转过程中传递数据。 首先,...

    Android AIDL demo (Android Studio)

    在Android开发中,AIDL(Android Interface Definition Language)是一种用于实现进程间通信(IPC, Inter-Process Communication)的工具。本教程将详细讲解如何在Android Studio中创建并使用AIDL,以便不同进程间的...

    Android 之 Parcelable 序列化

    在Android开发中,数据序列化是一个非常重要的概念,它允许对象的状态被保存和恢复,以便在不同的时间点或不同的环境中重建对象。Parcelable是Android平台提供的一种高效的数据序列化方式,比传统的Serializable接口...

    Android IPC.docx

    Android IPC机制是Android开发中非常重要的一个方面,通过理解IBinder接口和`transact`方法的工作原理,开发者可以更好地掌握如何设计和实现跨进程通信。此外,了解`IPCThreadState`类的具体实现有助于更深入地理解...

    android 屏幕截屏源码分享

    在Android开发中,我们可以使用多种方式来实现屏幕截屏,包括系统级别的截图以及应用程序级别的截图。 ### 1. 系统级别屏幕截屏 系统级别的屏幕截屏通常是通过系统服务来实现的,例如`SurfaceFlinger`服务。`...

    Android应用开发详解,刚刚整理扫描,非常好,强烈推荐

    在Android应用开发的世界里,Binder是核心组件之一,它构成了Android系统服务和应用程序间通信(IPC,Inter-Process Communication)的基础。...对于任何致力于Android开发的人来说,这些都是不可或缺的知识点。

    Android-Fit利用SharedPreferences存储对象

    在Android应用开发中,SharedPreferences是Android提供的一种轻量级的数据存储方式,主要用于存储一些简单的配置信息,如用户...在Android开发中,理解并熟练运用这些技巧,对于优化用户体验和提高应用效率至关重要。

    android AIDL demo讲解

    在Android应用开发中,当需要在不同进程间共享数据或者调用服务时,AIDL就显得尤为重要。下面将详细讲解AIDL的基本概念、工作原理以及如何创建和使用AIDL接口。 ### 一、AIDL基本概念 1. **进程间通信(IPC)**:...

Global site tag (gtag.js) - Google Analytics