Android Parcelable接口使用方法详解

首先介绍一下Parcelable接口,它是Android平台内部用于进程间通信(IPC)的一个轻量级序列化框架,相比较于Java自带的Serializable接口,Parcelable接口在性能方面有更好的表现。

一、实现Parcelable接口

要使用Parcelable接口,需要先实现它。具体实现过程如下所示:

1.在实体类中实现Parcelable接口

public class MyEntity implements Parcelable {
    private int id;
    private String name;

    // 构造函数
    public MyEntity(int id, String name) {
        this.id = id;
        this.name = name;
    }

    // 读取顺序必须和写入顺序相同
    protected MyEntity(Parcel in) {
        id = in.readInt();
        name = in.readString();
    }

    // 必须实现此方法
    public static final Creator<MyEntity> CREATOR = new Creator<MyEntity>() {
        @Override
        public MyEntity createFromParcel(Parcel in) {
            return new MyEntity(in);
        }

        @Override
        public MyEntity[] newArray(int size) {
            return new MyEntity[size];
        }
    };

    // 写入顺序必须和读取顺序相同,否则会报错
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(id);
        dest.writeString(name);
    }

    // 必须实现此方法,返回0即可
    @Override
    public int describeContents() {
        return 0;
    }

    // 省略getter和setter方法
}

2.重写读取、写入、创建、描述方法

Parcel对象提供了一组用于读写的方法,需要在实体类中重写以下四个方法:

  • readFromParcel(Parcel in):从Parcel对象中读取需要的数据,读取顺序必须和写入顺序相同
  • writeToParcel(Parcel dest, int flags):将需要传递的数据写入Parcel对象,写入顺序必须和读取顺序相同
  • CREATOR:用于反序列化Parcel对象,创建MyEntity实例的时候调用
  • describeContents():返回额外标志位信息,一般设置为0即可

二、将Parcelable对象传递给其他组件

1.传递Parcelable对象

Parcelable对象通常被用于Intent或者Bundle中进行传递:

// 创建Parcelable对象
MyEntity entity = new MyEntity(1, "MyEntity");

// 将Parcelable对象放入Intent中进行传递
Intent intent = new Intent(this, NextActivity.class);
intent.putExtra("entity_key", entity);
startActivity(intent);

2.获取Parcelable对象

在NextActivity中获取Parcelable对象的方法如下所示:

// 获取Parcelable对象,在onCreate方法中调用
MyEntity entity = getIntent().getParcelableExtra("entity_key");

三、代码示例

这里提供两个示例以说明Parcelable接口的使用方法。

  1. 实现Parcelable接口

假设有如下实体类:

public class MyEntity implements Parcelable {
    private int id;
    private String name;

    public MyEntity(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public MyEntity(Parcel in) {
        id = in.readInt();
        name = in.readString();
    }

    public static final Creator<MyEntity> CREATOR = new Creator<MyEntity>() {
        @Override
        public MyEntity createFromParcel(Parcel in) {
            return new MyEntity(in);
        }

        @Override
        public MyEntity[] newArray(int size) {
            return new MyEntity[size];
        }
    };

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(id);
        dest.writeString(name);
    }

    @Override
    public int describeContents() {
        return 0;
    }
}
  1. 在Activity中使用Parcelable对象传递数据
public class MainActivity extends AppCompatActivity {
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MyEntity entity = new MyEntity(1, "MyEntity");
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                intent.putExtra("parcel_key", entity);
                startActivity(intent);
            }
        });
    }
}
  1. 在SecondActivity中获取Parcelable对象
public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        MyEntity entity = getIntent().getParcelableExtra("parcel_key");
        Toast.makeText(this, entity.getId() + ", " + entity.getName(), Toast.LENGTH_SHORT).show();
    }
}

通过以上两个示例,我们可以直观地感受到Parcelable接口的使用方法,并且更好地理解其具体实现过程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android Parcelable接口使用方法详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 关于python:如何删除目录?

    以下是关于“关于python:如何删除目录?”的完整攻略,包含两个示例。 如何删除目录? 在Python中,我们可以使用os模块中的rmdir()和shutil模块中的rmtree()函数来删除目录。以下是关于如何删除目录的详细攻略。 1. 使用os模块中的rmdir()函数 os模块中的rmdir()函数可以删除空目录。以下是使用os模块中的rmdir()…

    other 2023年5月9日
    00
  • 如何正确使用Android线程详解

    如何正确使用Android线程详解 在Android开发中,线程是一个非常重要的概念。如果我们需要在应用程序中执行一些耗时的操作,我们必须考虑使用线程来避免UI线程阻塞。本文将提供一些关于Android线程的知识以及示例,展示如何使用线程来处理后台任务。 线程基础知识 Android提供了两种线程类型,即UI线程和后台线程。UI线程是指所有与用户界面相关的操…

    other 2023年6月27日
    00
  • uboot添加自定义命令的实现步骤

    实现自定义命令,需要完成以下几个步骤: 步骤一:在include/configs/xxx.h中添加宏定义 在 xxx.h 配置文件中添加自定义命令的宏定义,定义方式如下: #define CONFIG_SYS_MY_COMMAND // 命令名称 #define CONFIG_SYS_MY_COMMAND_DESC "My command desc…

    other 2023年6月25日
    00
  • OPPO Pad评测 2299元,这块智慧生态屏值吗?

    OPPO Pad评测攻略 介绍 OPPO Pad是一款智慧生态屏,售价为2299元。在评估其是否值得购买之前,我们将对其进行全面评测,包括性能、功能、设计等方面的考量。 性能评测 我们将对OPPO Pad的性能进行评测,包括处理器性能、内存容量、存储空间等方面的考量。以下是两个示例说明: 处理器性能:我们将使用基准测试工具(如Geekbench)对OPPO …

    other 2023年10月18日
    00
  • C语言基础 strlen 函数

    C语言基础 strlen 函数 简介 strlen函数是C语言中非常常用的字符串函数之一,用于计算一个字符串的长度。其原型为: size_t strlen(const char *str); 函数原型的返回值类型为 size_t, size_t 是一个无符号整数类型,其大小通常与 unsigned int 相同,用于保证变量的值为正数。函数的参数是一个指向字…

    other 2023年6月27日
    00
  • js中Image对象以及对其预加载处理示例

    JS中的Image对象用于创建图片实例,可以用于实现图片的预加载。图片预加载可以让网页在用户打开时更快地展示图片,在用户看到图片前就已经开始加载。 Image对象基本用法 var img = new Image(); // 创建Image对象 img.src = ‘image.jpg’; // 设置图片源 在这个例子中,我们创建了一个Image对象,并将源设…

    other 2023年6月25日
    00
  • uml14种图记忆口诀

    以下是关于“UML 14种图记忆口诀”的完整攻略: UML是一种用于软件开发的标准建模语言,包括14种不同类型的图。为了更好地记忆这些,可以使用以下口诀: 序图:时间轴,垂直画。 用例图:用户需求,功能列。 类图:属性和方法,关系连。 活动图:流程控制,节点画。 状态图:状态变化,箭头连。 部署图:物理结构,节点画。 组件图:模块划分,节点画。 对象图:实例…

    other 2023年5月7日
    00
  • android自定义view制作圆形进度条效果

    下面我将为你详细讲解Android自定义View制作圆形进度条效果的完整攻略。 一、前置知识 在学习制作圆形进度条之前,我们需要掌握以下一些知识: Android自定义View的基本原理 画笔(Paint)的使用 Canvas的使用 如果你对这些知识还不是很熟悉,可以查看相关的资料和学习。 二、绘制圆形进度条的原理 实现圆形进度条的关键在于理解角度的概念,以…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部