首页 > 其他分享 >Android开发 - Parcelable 接口实现不同组件之间传递数据解析

Android开发 - Parcelable 接口实现不同组件之间传递数据解析

时间:2024-08-29 09:52:59浏览次数:9  
标签:name 对象 Parcelable age User 传递数据 Android Parcel

什么是 Parcelable

  • Parcelable 是用于对象序列化的一种接口。通俗来讲,Parcelable 允许将一个对象转化为一个字节流,这样你就可以将这个对象在不同组件之间(如 Activity、Service 等)进行传递

为什么需要 Parcelable

  • 组件之间通信时(比如在两个 Activity 之间传递数据),传递的对象必须被序列化序列化是将对象转换可以存储或传输格式。它有两种序列化方式:SerializableParcelableParcelable 相对于 Serializable高效,因此更推荐使用

Parcelable 的工作流程

  1. 实现 Parcelable 接口需要实现 Parcelable 接口覆盖 writeToParcel() 方法,将对象的每个字段写入 Parcel 对象

  2. 定义一个 CREATOR 静态字段:它是一个实现了 Parcelable.Creator 接口对象,负责从 Parcel读取数据并创建对象

代码示例

  • 有一个 User 类,我们想要在两个 Activity 之间传递

    public class User implements Parcelable { 
        // User 类实现了 Parcelable 接口,表示这个类的对象可以被序列化并用于传递。
    
        private String name;
        private int age;
        // 定义了两个字段:name(String 类型)和 age(int 类型)。
    
        // 构造函数
        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }
        // 这是一个普通的构造函数,用于创建 User 对象时初始化 name 和 age 字段。
    
        // 从 Parcel 中读取数据的构造函数
        protected User(Parcel in) {
            name = in.readString();  // 从 Parcel 中读取 String 类型的数据并赋值给 name 字段。
            age = in.readInt();      // 从 Parcel 中读取 int 类型的数据并赋值给 age 字段。
        }
        // 这是一个特殊的构造函数,用于从 Parcel 对象中读取数据并创建 User 对象。
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(name); // 将 name 字段写入到 Parcel 中。
            dest.writeInt(age);     // 将 age 字段写入到 Parcel 中。
        }
        // 这是 Parcelable 接口中的方法,用于将 User 对象的字段写入 Parcel。这样它就可以被系统传输。
    
        @Override
        public int describeContents() {
            return 0;
        }
        // 这是 Parcelable 接口中的方法。通常返回 0 就可以。它用于描述当前对象的内容类型。
    
        public static final Creator<User> CREATOR = new Creator<User>() {
            // CREATOR 是一个静态常量,是用于创建 User 类的对象并提供新数组的方法。
            // 一个静态字段,用于从 Parcel 中创建新的 User 对象以及 User 数组。它是 Parcelable.Creator<User> 的实例,实现了两个方法:createFromParcel() 和 newArray()。
    
            @Override
            public User createFromParcel(Parcel in) {
                return new User(in);
            }
            // 从 Parcel 中读取数据并返回一个新创建的 User 对象。
    
            @Override
            public User[] newArray(int size) {
                return new User[size];
            }
            // 创建一个指定大小的 User 数组。
        };
        // CREATOR 的定义结束。这个字段用于实现 Parcelable 接口中的 createFromParcel 和 newArray 方法。
    }
    
  • Activity 之间传递这个对象

    • 传递数据

      Intent intent = new Intent(CurrentActivity.this, NextActivity.class);
      User user = new User("Alice", 30);
      intent.putExtra("user_data", user);
      startActivity(intent);
      
    • 接收数据

      Intent intent = getIntent();
      User user = intent.getParcelableExtra("user_data");
      

总结

  • Parcelable 是用于高效对象序列化和传递的一种方式

  • 比 Serializable 更快,更适合

  • 需要实现 Parcelable 接口****并编写序列化和反序列化代码**

标签:name,对象,Parcelable,age,User,传递数据,Android,Parcel
From: https://www.cnblogs.com/ajunjava/p/18385945

相关文章

  • Android经典实战之存储方案对比:SharedPreferences vs MMKV vs DataStore
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点在Android开发中,键值对存储(Key-ValueStorage)是一种经常用到的轻量级数据存储方案。它主要用于保存一些简单的配置数据或状态信息,例如用户设置、缓存数据等。常......
  • Android Audio分区——车载多区音频基础(一)
            AndroidAudio多区音频功能主要针对的是AndroidAutomotive这样的场景,它允许在同一个Android设备上支持多个独立的音频区域,每个区域可以有不同的音频输出设置。这种功能特别适用于汽车环境,因为车内通常有多个乘客,他们可能希望听不同的音频内容。一、概念......
  • 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接口时,它需要提供这个方法的实现,里面写上......
  • 如何在Android上恢复永久删除的照片?
    您是否曾经不小心从Android手机中删除了珍贵的照片,并以为它们已经永远消失了?不要恐慌。我们为您提供了有关如何在Android上恢复永久删除的照片的指南。无论是怀旧之旅还是您需要找回的重要记忆,我们都会引导您完成安全、轻松地取回这些照片的步骤。 第1部分:是否可以恢复......
  • Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点在移动端开发中,数据加密是确保数据传输和存储安全的重要手段。常见的加密算法包括对称加密算法(如AES)、非对称加密算法(如RSA)、散列算法(如SHA-256),以及消息认证码(如......
  • Android经典实战之使用compose时一般用一个activity还是多个
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点在使用JetpackCompose开发Android应用时,选择使用一个Activity还是多个Activity主要取决于应用的架构和复杂性。以下是一些权衡和指导建议,可以帮助你做出决......
  • 后端给前端传递数据形式:广播 单播以及组播
    目录1.单播2.广播3.组播4.任播5.总结网络数据在传输时需要使用特定的传输方式,其中最常见的包括单播、广播、组播和任播。本文将对这四种不同的网络传输方式进行详细介绍,并列举多个例子以说明不同场景下使用何种传输方式。1.单播单播是指一种向单个目标地址传送数......