首页 > 其他分享 >Android开发 - Parcel 类打包对象数据进行传递解析

Android开发 - Parcel 类打包对象数据进行传递解析

时间:2024-08-29 11:14:52浏览次数:10  
标签:Parcel 对象 User Activity Android 序列化 打包 parcel

Parcel 是什么

  • Parcel 是用于对象序列化反序列化的一个。通俗地说,它是一种轻量级容器,常用于打包对象的数据(如基本类型和其他 Parcelable 对象),使它们能够在不同的组件(如 Activity、Service 等)之间传递

Parcel的主要作用

  • 不同的组件(如 Activity、Service)之间需要传递数据。例如,在一个 Activity 启动另一个 Activity 时,可能需要传递一些数据,如字符串整数或者自定义对象Parcel 可以以一种非常高效的方式序列化这些数据,从而可以通过 Intent 等机制传递它们

Parcel 的工作原理

  • Parcel 的工作机制:它将数据序列化为二进制格式,然后将其打包到一个 Parcel 对象中。这个对象可以传递其他组件,其他组件接收到后再将数据从二进制格式反序列化回来,恢复成原始的对象

使用 Parcel 的好处

  • Parcel 的效率非常高,因为它不像 Serializable 那样需要进行大量反射操作Parcel 直接处理原始数据,因此更建议使用

Parcel 常用方法

  • parcel.write...() 方法:用于将数据写入 Parcel 对象。例如:
    • parcel.writeInt(int val):将一个整数写入 Parcel
    • parcel.writeString(String str):将一个字符串写入 Parcel
    • parcel.writeParcelable(Parcelable p, int flags):将一个 Parcelable 对象写入 Parcelflags 通常作为一个整数标记很少使用
  • parcel.read...() 方法:用于从 Parcel 对象读取数据。例如:
    • parcel.readInt():从 Parcel读取一个整数
    • parcel.readString():从 Parcel读取一个字符串
    • parcel.readParcelable(ClassLoader classLoader):从 Parcel读取一个 Parcelable 对象

代码示例

  • 假设有一个自定义对象 User,想要在两个 Activity 之间传递这个对象。需要将 User 对象序列化为 Parcel,然后传递下一个 Activity

    • 写入数据到 Parcel

      Parcel parcel = Parcel.obtain(); // 获取一个空的 Parcel 对象
      
      User user = new User("Alice", 30);
      user.writeToParcel(parcel, 0);  // 使用 User 类的 writeToParcel 方法将对象写入 Parcel
      
      parcel.setDataPosition(0);  // 重置 Parcel 的数据位置,以便读取
      
    • 从 Parcel 中读取数据

      User userFromParcel = User.CREATOR.createFromParcel(parcel);  // 使用 CREATOR 从 Parcel 中创建 User 对象
      

总结

  • Parcel 是特有的类:专门用于高效地序列化反序列化数据

  • Parcel 不进行类型检查:需要按照写入的顺序和类型读取数据

  • 比 Serializable 更高效Parcel直接操作内存中的数据没有额外的反射操作

标签:Parcel,对象,User,Activity,Android,序列化,打包,parcel
From: https://www.cnblogs.com/ajunjava/p/18386296

相关文章

  • Node脚本打包uniapp热更新wgt文件
    通过脚本打包uniapp热更新wgt文件前言:uniapp只能通过hbuilder打包wgt文件目标:通过脚本命令打包wgt文件实现思路uniapp官方文档已经提供了wgt文件的的生成思路:目前使用npmrunbuild:app-plus会在/dist/build/app-plus下生成app打包资源。如需制作wgt包,将app-plus中的文......
  • 我的新书《Android系统多媒体进阶实战》正式发售
    我的新书要正式发售了,把链接贴在下面,感兴趣的朋友可以支持下。❶发售平台:当当,京东,抖音北航社平台,小红书,b站❷目前当当和京东已开启预售❸当当网https://u.dangdang.com/KIDHJ❹京东商城https://item.m.jd.com/product/10109083199634.html?gx=RnAoqRAjajbdh8lR5Q&gxd......
  • Android开发 - Parcelable 接口实现不同组件之间传递数据解析
    什么是ParcelableParcelable是用于对象序列化的一种接口。通俗来讲,Parcelable允许将一个对象转化为一个字节流,这样你就可以将这个对象在不同的组件之间(如Activity、Service等)进行传递为什么需要Parcelable组件之间通信时(比如在两个Activity之间传递数据),传递的对象必......
  • Android经典实战之存储方案对比:SharedPreferences vs MMKV vs DataStore
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点在Android开发中,键值对存储(Key-ValueStorage)是一种经常用到的轻量级数据存储方案。它主要用于保存一些简单的配置数据或状态信息,例如用户设置、缓存数据等。常......
  • Android Audio分区——车载多区音频基础(一)
            AndroidAudio多区音频功能主要针对的是AndroidAutomotive这样的场景,它允许在同一个Android设备上支持多个独立的音频区域,每个区域可以有不同的音频输出设置。这种功能特别适用于汽车环境,因为车内通常有多个乘客,他们可能希望听不同的音频内容。一、概念......
  • Nginx 的编译并打包成二.txt
    Nginx的编译并打包成二进制文件是一个涉及源代码编译和静态链接的过程。‌下面是一个简单的步骤说明,‌帮助你从源代码编译Nginx并生成一个可独立运行的二进制文件。‌安装依赖首先,‌确保你的系统上安装了编译Nginx所需的依赖项。‌对于大多数Linux发行版,‌你可能需要安......
  • Android Qcom USB Driver学习(十一)
    基于TI的FirmwareUpdate固件升级的流程分析usbapplictionlayers的数据USBProtocolPackage①/②maptocheckpasswordcorrectPackageFormat:Byte[0]=ReportIdByte[1]=ValidLength(0x21=33)Byte[2]=BSLCoreCommands(0x11RXPassword)Byte[3]=Val......
  • Android 常用的性能分析工具详解:GPU呈现模式
    此篇将重点介绍几种常用的Android性能分析工具:一、Logcat日志选取Tag=ActivityManager,可以粗略地知道界面Displaying的时间消耗。当我们打开一个Activity的时候,log会打印一串log如下:I/ActivityManager﹕Displayedxxx.xxx.xxx/TestActivity:+1s272ms(total+3s843ms)第一......
  • Android开发 - “效验和”效验数据在传输或存储过程中是否出错解析
    校验和的基本原理校验和的基本原理非常简单,就是把一组数据中的所有字节(或者其他单位)的数值相加,然后得到一个总和,这个总和就是所谓的“校验和”。在传输数据时,发送方会把数据和校验和一起发送出去;接收方收到数据后,也会计算一次校验和,然后与发送方提供的校验和进行比较。如果两个......
  • Android开发 - Runnable 类任务接口定义与后台任务待办解析
    什么是RunnableRunnable接口是用来定义一个任务的接口,这个任务可以在线程中执行。通俗地说,它就像一个“待办事项”,用来描述需要在一个单独的线程中完成的工作。Runnable接口非常简单,只定义了一个方法:run()。当一个类实现了Runnable接口时,它需要提供这个方法的实现,里面写上......