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日

相关文章

  • asm入网小助手卸载

    以下是“asm入网小助手卸载的完整攻略”的详细讲解,过程中包含两个示例说明的标准Markdown格式文本: asm入网小助手卸载的完整攻略 asm入网小助手是一款方便快捷的网络工具,但有时候我们需要卸载它。本文将介绍如何彻底卸asm入网小助手。 1. Windows系统下的卸载 1.1 控制面板卸载 我们可以通过以下步骤在Windows系统下使用控制面板卸载…

    other 2023年5月10日
    00
  • Logback的使用及如何配置

    Logback的使用及如何配置攻略 1. 什么是Logback? Logback是一个开源的、可靠的、高性能的Java日志框架。它是log4j框架的继任者,提供了更快和更灵活的日志处理。 2. Logback的基本配置 首先,你需要在你的项目中引入Logback的依赖。在pom.xml文件中添加以下依赖: <dependencies> <d…

    other 2023年6月28日
    00
  • Java Bean的作用域,生命周期和注解

    Java Bean是一种可重用的Java组件,通过封装功能独立性强的成员变量和相应的get/set方法,使之成为一种与平台无关的可重用组件。Java Bean的作用域、生命周期和注解是Java Bean的三个重要方面,下面我们逐一讲解。 Java Bean的作用域 Java Bean有四种作用域:请求(request)、会话(session)、应用程序(ap…

    other 2023年6月27日
    00
  • PHP集成百度Ueditor 1.4.3

    接下来我将为您详细讲解“PHP集成百度Ueditor 1.4.3”的完整攻略,包含以下步骤: 步骤1:下载Ueditor源码 Ueditor是官方提供的所见即所得编辑器,可用于各种网站应用中。您可以在百度官网中下载最新的Ueditor源码:http://ueditor.baidu.com/website/download.html,解压到您的项目目录下。 步…

    other 2023年6月27日
    00
  • Androd 勇闯高阶性能优化之布局优化篇

    Android 勇闯高阶性能优化之布局优化篇攻略 1. 优化布局层次结构 在 Android 应用中,布局层次结构的复杂度会直接影响应用的性能。通过优化布局层次结构,可以提高应用的渲染速度和响应性能。 示例说明 1: 使用 <merge> 标签 当布局文件中的根布局只包含一个子视图时,可以使用 <merge> 标签来减少布局层次结构的…

    other 2023年8月21日
    00
  • C# 窗体(登录界面)

    C# 窗体(登录界面) 简介 在开发一个C# WinForm 应用程序时,登录界面作为很重要的一环,往往是APP的入口界面,这也是给人们留下“第一印象”的地方之一,因此为了让应用程序展现更好的用户体验,设计一个美观、实用、易用的登录界面显得尤为重要。 本文将讲解如何使用C# WinForm设计一个简单而实用的登录界面。 实现方法 设计登录界面 登录界面应该包…

    其他 2023年3月28日
    00
  • Android10 客户端事务管理ClientLifecycleManager源码解析

    Android10 客户端事务管理ClientLifecycleManager源码解析 什么是ClientLifecycleManager ClientLifecycleManager是Android10中用于管理客户端事务的一个类。它通过协调客户端和系统间的通信和交互,来确保客户端的正确使用和可靠性。 为什么使用ClientLifecycleManager…

    other 2023年6月25日
    00
  • css的!important规则对性能有影响吗

    CSS的!important规则对性能有影响吗? 在样式表中,有时我们需要强制某些样式优先生效,这时就可以使用!important规则。但是,在使用!important规则时,是否会影响CSS的性能呢? 事实上,当CSS文件的大小很小时,使用!important规则通常不会对浏览器的性能造成影响。但是,当CSS文件的大小逐渐增加时,使用!important规…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部