Parcelable接口的使用

Android 序列化 ---- Parcelable原理分析 Parcelable是专门为Android设计的序列化接口。它是基于内存,底层是通过指针挪动实现。因此,执行效率比Java的Serializable要高的多,号称快10倍。 一个简单的使用Parcelable进行序列化的例子: public class ParcelObj implements Parcelable { private String strField; private int intField; // 需要提供一个接收 Parc... 阅读详情

Parcelable接口的使用


什么是Parcelable ?

     Parcelable,定义了将数据写入Parcel,和从Parcel中读出的接口。一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为“可打包的”了。

 

Parcelable 传递对象

    Android序列化对象主要有两种方法:

    1.实现Serializable接口,实现Serializable接口是JavaSE本身就支持的;

    2.实现Parcelable接口,Parcelable是Android特有的功能,效率比实现Serializable接口高,像用于Intent数据传递也都支持,而且还可以用在进程间通信(IPC),

      除了基本类型外,只有实现了Parcelable接口的类才能被放入Parcel中。

 

Parcelable接口定义

复制代码
public interface Parcelable {
    //内容描述接口,基本不用管
    public int describeContents();
    //写入接口函数,打包
    public void writeToParcel(Parcel dest, int flags);
     //读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入。
    //为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例。
    public interface Creator<T> {
           public T createFromParcel(Parcel source);
           public T[] newArray(int size);
       }
复制代码

 

怎么实现Parcelable接口?

   从parcelable接口定义中,我们可以看到,实现parcelable接口,需要我们实现下面几个方法:

   1.describeContents方法。内容接口描述,默认返回0就可以;

   2.writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.即打包需要传递的数据到Parcel容器保存,以便从parcel容器获取数据,该方法声明如下:

     writeToParcel (Parcel dest, int flags) 具体参数含义见javadoc

   3.静态的Parcelable.Creator接口,本接口有两个方法:

     createFromParcel(Parcel in)  从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。

     newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。

 

代码实现

    1.封装数据,把实现parcelable接口的Person对象传递到TwoActivity里;

复制代码
public class DemoActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 封装数据
        Person p = new Person();
        p.setId(1);
        p.setName("xiaoming");
        // 用Intent传递Person对象
        Intent i = new Intent(this, TwoActivity.class);
        i.putExtra("Person", p);
        startActivity(i);
    }
}
复制代码

 

   2.TwoActivity获取数据,从DemoActivity传递的Person对象给解析,并打印;

   

复制代码
public class TwoActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        
        Person p = (Person)getIntent().getParcelableExtra("Person");
        
        System.out.println("p_id"+p.getId());
        System.out.println("p_name"+p.getName());
    }
}
复制代码

 

3.parcelable接口的实现

复制代码
 1 public class Person implements Parcelable{
 2     
 3     // 成员变量
 4     private int id;
 5     private String name;
 6     
 7     // 1.必须实现Parcelable.Creator接口,否则在获取Person数据的时候,会报错,如下:
 8     // android.os.BadParcelableException:
 9     // Parcelable protocol requires a Parcelable.Creator object called  CREATOR on class com.um.demo.Person
10     // 2.这个接口实现了从Percel容器读取Person数据,并返回Person对象给逻辑层使用
11     // 3.实现Parcelable.Creator接口对象名必须为CREATOR,不如同样会报错上面所提到的错;
12     // 4.在读取Parcel容器里的数据事,必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
13     // 5.反序列化对象
14     public static final Parcelable.Creator<Person> CREATOR = new Creator(){
15 
16         @Override
17         public Person createFromParcel(Parcel source) {
18             // TODO Auto-generated method stub
19             // 必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
20             Person p = new Person();
21             p.setId(source.readInt());
22             p.setName(source.readString());
23             return p;
24         }
25 
26         @Override
27         public Person[] newArray(int size) {
28             // TODO Auto-generated method stub
29             return new Person[size];
30         }
31     };
32     
33     public int getId() {
34         return id;
35     }
36 
37     public void setId(int id) {
38         this.id = id;
39     }
40 
41     public String getName() {
42         return name;
43     }
44 
45     public void setName(String name) {
46         this.name = name;
47     }
48 
49     @Override
50     public int describeContents() {
51         // TODO Auto-generated method stub
52         return 0;
53     }
54 
55     @Override
56     public void writeToParcel(Parcel dest, int flags) {
57         // TODO Auto-generated method stub
58         // 1.必须按成员变量声明的顺序封装数据,不然会出现获取数据出错
59         // 2.序列化对象
60         dest.writeInt(id);
61         dest.writeString(name);
62     }
63 }
复制代码

 

 

好了,parcelable接口的实现,到此结束!!

 

转载出处:http://www.cnblogs.com/hpboy

深入理解安卓Parcelable序列化技术 本文还有配套的精品资源,点击获取 简介:在Android开发中,Parcelable是一种高效的序列化机制,优于Serializable接口,提供直接内存操作,提高性能。文章将详细介绍Parcelable的使用方法和实例解析,通过 parcelableDemo 项目实战演练,讲解如何实现Parcelable接口、处理嵌套序列化,并通过项目示例演示在不同场景下P... 阅读详情

相关推荐

Android中Parcelable的使用详解

Parcelable与Serializable Serializable是Java为我们提供的一个标准化的序列化接口。 Parcelable是Android为我们提供的序列化的接口。 对比: 1、Parcelable相对于Serializable的使用相对复杂一些。 2、Parcelable的效率相对Serializable也高很多。 3、Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable在外界有变化的情况下不能很好的保证数据的持续性。尽管Serializable效率低点,但此时还是建议使用Serializable。存储到设备或者网络传输上选择Serializa

Android中Parcelable的原理和使用方法

Parcelable的简单介绍 介绍Parcelable不得不先提一下Serializable接口,Serializable是Java为我们提供的一个标准化的序列化接口,那什么是序列化呢? 进行Android开发的时候,无法将对象的引用传给Activities或者Fragments,我们需要将这些对象放到一个Intent或者Bundle里面,然后再传递。简单来说就是将对象转换为可以传输的二进制流(二进制序列)的过程,这样我们就可以通过序列化,转化为可以在网络传输或者保存到本地的流(序列),从而进行传

Dream It Possible 4万+

AI编程实战:用Spec Coding与Codex半小时重构全栈项目

这次我们来看一个能显著提升全栈开发效率的实战方法:利用 AI 编程工具 Codex 和 Spec Coding 工作流,将原本需要数周甚至一个月的全栈项目重构工期,压缩到半小时级别。这不是概念探讨,而是基于现有工具链的、可立即上手的工程实践。 对于前端开发者或全栈工程师而言,面对老旧项目重构、技术栈升级或从零搭建新项目时,最大的痛点往往是重复性、模式化的代码编写工作。手动编写 CRUD 接口、页面组件、状态管理和联调测试,耗时费力且容易出错。而 AI 辅助编程的核心价值,正是在于将开发者从这些“体力活”中解

weixin_33525298的博客 290

Android 中parcelable 和 parcel

之前一直在用这两个类,但是没有细细的研究,偶尔在网上看到了相关的解释,感觉不是很详细,这里小结一下,如果还有什么遗漏希望有朋友能提出来。1. parcel首先说一下parcel,因为 parcelable 核心也是依赖 parcel 的。java中serialize机制,是能将数据对象存入字节流中,在需要的时候重新生成对象,主要应用是利用外部存储设备保存对象状态,以及通过网络传输对象等。

私房菜 4831

保姆级教程:Unity编辑器汉化全流程(从下载到配置避坑指南)

本文提供Unity编辑器汉化的保姆级教程,涵盖从下载中文语言包到配置避坑的全流程。详细解析版本适配、文件系统交互及编辑器底层配置逻辑,帮助开发者高效完成汉化,解决常见报错问题,提升工作效率。

weixin_30825581的博客 155

全网首发:香橙派5MAX安装ubuntu20.04(换了官方桌面)及ros,运行LIVOX-mid360混合固态激光雷达,实际测试fastlio(只能说可以跑,还是有点吃力)

独家发布!!!香橙派5MAX安装ubuntu20.04(换了官方桌面)及ros,运行mid360混合固态激光雷达,测试fastlio(只能说可以跑,还是有点吃力),国货也算崛起了。

2402_82745259的博客 5997

android 如何使用Parcelable接口

今天,简单讲讲android如何使用Parcelable接口传递数据。 这个其实也很简单,之前我写过博客将关于Serializable接口传递对象,实现Parcelable接口也是为了传递对象,但效率更高,所以在网上查找了相关的资料,这里记录一下。   想要在两个activity之间传递对象,那么这个对象必须序列化,android中序列化一个对象有两种方式,一种是实现Serializable...

谢岩的博客 7320

【RK3588开发记录】超详细的RK3588修改debug串口波特率为115200

修改RK3588的debug串口为115200

Crazydrams的博客 4804

android中Parcelable接口的使用

目录(?)[-] android中Parcelable接口的使用 一理解二源码三示例 android中Parcelable接口的使用 一、理解 Parcelable是一个接口、用来实现序列化。与此类似的还有一个接口Serializable,这是JavaSE本身支持的,而Parcelable是android特有的。二者比较: 1、Parcelable使用起来稍复杂

Android移动开发者的专栏 758

MNE-python 进行源定位教程(一)配置环境

根据MNE官网提供的教程进行复现,遇到各种问题的记录。 配置环境 python3.8 + Anaconda + pycharm MNE-Python 是一个开源 Python 模块,用于处理、分析和可视化功能性神经影像数据(EEG、MEG、sEEG、ECoG 和 fNIRS)。 根据官方建议,将MNE-python安装在anaconda的虚拟环境中。 1. 安装Anaconda 过程点击这里 2. 配置pycharm 2.1 导入MNE-python工具包 在pycharm的菜单栏里打开VCS-Create

zQIANYUN的博客 3173

RDKit | 基于Murcko骨架聚类化合物库

化合物多样性评估 一种方法是使用合适的指纹技术将化合物矢量化并评估他们之间的距离。这种方法经常被使用,但是对于人类很难直观地理解化合物之间的距离。 基于Murcko骨架,分子大致聚集在化合物骨架中,并且每个簇中的顶部化合物都作为候选化合物。此方法非常符合人类的直觉,因此可以预期人将通过查看候选化合物列表来自动缩小化合物的范围。 Murcko骨架 Mur...

DrugOne 3766

Parcelable接口的使用——要将实体类封装到消息中,必须实现该接口

参考文章:Parcelable接口的使用

Coding_Beginner的博客 437

OTFS 消息传递算法信号检测【附matlab代码详解】

OTFS 消息传递算法方面的一些浅浅理解。

Cuby的博客 4010

Android中Parcelable接口的使用

  在做开发的过程中,序列化是非常常见的。比如要将对象保存本地磁盘或者在网络上传输等。实现序列化有两种方式,一种是实现Serializable接口,第二种是实现Parcelable。 Serializable与Parcelable的区别   1、Serializable是JDK提供的接口,而Parcelable是Android SDK提供的。   2、Serializable序列化...

daxiang3255的博客 194

【unity游戏开发之InputSystem——01】通过写代码监听InputSystem输入(基于unity6开发介绍)

通过写代码监听InputSystem输入(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4892

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android Parcelable接口的使用

Serializable(Java自带): Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。 Parcelable(android 专用): 除了Serializable之外,使用Parcelable也可以实现相同的效果, 不过不同于将对象进行序列化,Parcelable方式的实现原理是将一个完整的对

peiyuWang_2015的博客 474

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android中使用Parcelable接口

Android中传递复杂类型,主要是将自己的类转换为基础的字节数组,Activity之间传递数据是通过Intent实现的。 Android序列化对象主要有两种方法,实现Serializable接口、或者实现Parcelable接口。 实现Serializable接口是Java本身就支持的,而Parcelable是Android特有的功能,效率比实现Seriali

sinat_31820805的博客 413

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Parcelable接口使用

android提供了一种新的类型:Parcel。通过继承自Parcelable接口即可以在Intent中通过putParcelable方法传递对象。 Parcelable接口需要实现以下方法: writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中

魏振耀 796
上一篇: Android Bundle类
下一篇: Android 中的Parcelable序列化对象
hxwhou
博客等级 码龄16年 100粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值