`
zhiying201039
  • 浏览: 43130 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[转]详解Android中的Parcelable

阅读更多

一:

转自: http://blog.sina.com.cn/s/blog_78e3ae430100pxba.html

 

android提供了一种新的类型:Parcel。本类被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递。 除了基本类型以
外,只有实现了Parcelable接口的类才能被放入Parcel中。
 
Parcelable实现要点:需要实现三个东西
1)writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.声明如下:
writeToParcel (Parcel dest, int flags) 具体参数含义见javadoc
2)describeContents方法。没搞懂有什么用,反正直接返回0也可以
3)静态的Parcelable.Creator接口,本接口有两个方法:
createFromParcel(Parcel in) 实现从in中创建出类的实例的功能
newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。估计本方法是供外部类反序列化本类数组使用。
测试用的接收信息Activity
import android.app.Activity;   
 
import android.content.Intent;   
 
import android.os.Bundle;   
import android.os.Parcelable;   
  
public class Test extends Activity {   
      
    @Override  
    public void onCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.main);   
        Intent i = getIntent();   
        Person p = i.getParcelableExtra("yes");   
        System.out.println("---->"+p.name);   
        System.out.println("---->"+p.map.size());   
    }   
}  
发送的Activity
import java.util.HashMap;   
  
import android.app.Activity;   
import android.content.Intent;   
import android.os.Bundle;   
  
public class TestNew extends Activity {   
      
    @Override  
    public void onCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.main);   
        Intent intent = new Intent();   
        Person p = new Person();   
        p.map = new HashMap<String,String>();   
        p.map.put("yes", "ido");   
        p.name="ok";   
        intent.putExtra("yes", p);   
        intent.setClass(this, Test.class);   
        startActivity(intent);   
    }   
}  
Parcelable的实现类
import java.util.HashMap;   
  
import android.os.Parcel;   
import android.os.Parcelable;   
  
public class Person implements Parcelable {   
  
    public HashMap<String,String> map = new HashMap<String,String> ();   
       
    public String name ;   
    @Override  
    public int describeContents() {   
        return 0;   
    }   
  
    @Override  
    public void writeToParcel(Parcel dest, int flags) {   
  
        dest.writeMap(map);   
        dest.writeString(name);   
    }   
    public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {   
//重写Creator
  
        @Override  
        public Person createFromParcel(Parcel source) {   
            Person p = new Person();   
            p.map=source.readHashMap(HashMap.class.getClassLoader());   
            p.name=source.readString();   
            return p;   
        }   
  
        @Override  
        public Person[] newArray(int size) {   
            // TODO Auto-generated method stub   
            return null;   
        }   
    };   
  

}   

 

二:

转自:http://ipjmc.iteye.com/blog/1314145

 

Android序列化对象主要有两种方法,实现Serializable接口、或者实现Parcelable接口。实现Serializable接口是Java SE本身就支持的,而Parcelable是Android特有的功能,效率比实现Serializable接口高,而且还可以用在IPC中。实现Serializable接口非常简单,声明一下就可以了,而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。下面就介绍一下实现Parcelable接口的方法
        通过实现Parcelable接口序列化对象的步骤:
        1、声明实现接口Parcelable
        2、实现Parcelable的方法writeToParcel,将你的对象序列化为一个Parcel对象
        3、实例化静态内部对象CREATOR实现接口Parcelable.Creator:

Java代码 复制代码 收藏代码
  1. public static final Parcelable.Creator<T> CREATOR  
public static final Parcelable.Creator<T> CREATOR


       其中public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。
        4、完成CREATOR的代码,实现方法createFromParcel,将Parcel对象反序列化为你的对象

        简而言之:通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象。也可以将Parcel看成是一个流,通过writeToParcel把对象写到流里面,在通过createFromParcel从流里读取对象,只不过这个过程需要你来实现,因此写的顺序和读的顺序必须一致。
       
        Parcel对象可以通过以下方法写入或读取byte, double, float, int, long, String这6种类型变量。

Java代码 复制代码 收藏代码
  1. writeByte(byte), readByte()   
  2. writeDouble(double), readDouble()   
  3. writeFloat(float), readFloat()   
  4. writeInt(int), readInt()   
  5. writeLong(long), readLong()   
  6. writeString(String), readString()  
writeByte(byte), readByte()
writeDouble(double), readDouble()
writeFloat(float), readFloat()
writeInt(int), readInt()
writeLong(long), readLong()
writeString(String), readString()



        也可以读取或写入他们的数组

Java代码 复制代码 收藏代码
  1. writeBooleanArray(boolean[]), readBooleanArray(boolean[]), createBooleanArray()   
  2. writeByteArray(byte[]), writeByteArray(byte[], intint), readByteArray(byte[]), createByteArray()   
  3. writeCharArray(char[]), readCharArray(char[]), createCharArray()   
  4. writeDoubleArray(double[]), readDoubleArray(double[]), createDoubleArray()   
  5. writeFloatArray(float[]), readFloatArray(float[]), createFloatArray()   
  6. writeIntArray(int[]), readIntArray(int[]), createIntArray()   
  7. writeLongArray(long[]), readLongArray(long[]), createLongArray()   
  8. writeStringArray(String[]), readStringArray(String[]), createStringArray()   
  9. writeSparseBooleanArray(SparseBooleanArray), readSparseBooleanArray()  
writeBooleanArray(boolean[]), readBooleanArray(boolean[]), createBooleanArray()
writeByteArray(byte[]), writeByteArray(byte[], int, int), readByteArray(byte[]), createByteArray()
writeCharArray(char[]), readCharArray(char[]), createCharArray()
writeDoubleArray(double[]), readDoubleArray(double[]), createDoubleArray()
writeFloatArray(float[]), readFloatArray(float[]), createFloatArray()
writeIntArray(int[]), readIntArray(int[]), createIntArray()
writeLongArray(long[]), readLongArray(long[]), createLongArray()
writeStringArray(String[]), readStringArray(String[]), createStringArray()
writeSparseBooleanArray(SparseBooleanArray), readSparseBooleanArray()



        更多操作可以参阅:
http://developer.android.com/reference/android/os/Parcel.html
示例代码:

Java代码 复制代码 收藏代码
  1. package com.ipjmc.demo.parcelable;   
  2.   
  3.   
  4. import java.util.Date;   
  5.   
  6. import android.os.Parcel;   
  7. import android.os.Parcelable;   
  8.   
  9. public class ParcelableDate implements Parcelable { //声明实现接口Parcelable   
  10.   
  11.     //这里定义了两个变量来说明读和写的顺序要一致   
  12.     public long mId;   
  13.     public Date mDate;   
  14.        
  15.     public ParcelableDate(long id, long time) {   
  16.         mId = id;   
  17.         mDate = new Date(time);   
  18.     }   
  19.        
  20.     public ParcelableDate(Parcel source) {   
  21.         //先读取mId,再读取mDate   
  22.         mId = source.readLong();   
  23.         mDate = new Date(source.readLong());   
  24.     }   
  25.        
  26.     @Override  
  27.     public int describeContents() {   
  28.         return 0;   
  29.     }   
  30.   
  31.     //实现Parcelable的方法writeToParcel,将ParcelableDate序列化为一个Parcel对象   
  32.     @Override  
  33.     public void writeToParcel(Parcel dest, int flags) {    
  34.         //先写入mId,再写入mDate   
  35.         dest.writeLong(mId);   
  36.         dest.writeLong(mDate.getTime());   
  37.     }   
  38.   
  39.     //实例化静态内部对象CREATOR实现接口Parcelable.Creator   
  40.     public static final Parcelable.Creator<ParcelableDate> CREATOR = new Creator<ParcelableDate>() {   
  41.            
  42.         @Override  
  43.         public ParcelableDate[] newArray(int size) {   
  44.             return new ParcelableDate[size];   
  45.         }   
  46.            
  47.         //将Parcel对象反序列化为ParcelableDate   
  48.         @Override  
  49.         public ParcelableDate createFromParcel(Parcel source) {   
  50.             return new ParcelableDate(source);   
  51.         }   
  52.     };   
  53. }  
分享到:
评论

相关推荐

    android-parcelable-intellij-plugin Version 0.7.0

    《Android Parcelable IntelliJ 插件详解》 在Android开发过程中,我们常常需要实现Parcelable接口来方便对象的序列化和反序列化,以便于在Intent、Binder等场景中传递数据。然而,手动实现Parcelable接口的代码...

    Android中Parcelable的使用详解

    在Android开发中,数据传输和保存是常见的需求,而Parcelable接口就是Android系统提供的一种高效的数据序列化方式。相比Java标准的Serializable接口,Parcelable虽然使用起来更复杂,但是其性能优势明显,尤其适合于...

    利用Kotlin如何实现Android开发中的Parcelable详解

    在Android开发中,Parcelable接口是用于对象序列化和反序列化的高效机制,常用于Activity、Fragment之间或者Intent中传递复杂数据。Kotlin虽然提供了许多便利的功能,但在实现Parcelable时仍存在一些挑战,尤其是在...

    Android Parcelable接口使用方法详解

    Android Parcelable接口使用方法详解 1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel。 Classes implementing the Parcelable interface must also have ...

    Android序列化之Parcelable和Serializable的使用详解

    今天,我们将详细探讨 Android 序列化技术中 Parcelable 和 Serializable 两个接口的使用详解。 序列化和反序列化 序列化是将对象实例的状态存储到存储媒体(磁盘或者其他介质)的过程。在序列化过程中,对象的...

    Android Parcelable与Serializable详解及区别

    在Android开发中,数据传输和序列化是必不可少的环节,其中`Parcelable`和`Serializable`是两种常用的序列化方式。本文将深入解析这两种机制的区别、优缺点以及它们的使用场景。 首先,`Serializable`接口是Java...

    Android中Serializable和Parcelable序列化对象详解

    4. **Android中如何使用Parcelable进行序列化操作** - 在需要序列化的类中实现Parcelable接口,编写`writeToParcel()`和`createFromParcel()`方法。 - 使用`Parcel`对象的`writeString()`, `writeInt()`, `write...

    Android AIDL使用详解

    Parcelable是Android中用于序列化和反序列化对象的接口,使得复杂数据结构可以在进程间传递。 4. **多接口与继承** - 在AIDL中,你可以定义多个接口,并且一个接口可以继承另一个接口,这使得接口设计更加灵活。 ...

    Android Intent传递数据大小限制详解

    前言 在sendBroadcast,startActivity时,我们会用到Intent。 Intent可以携带一些数据,比如基本类型数据int、Boolean,或是String,或是序列化...在Intent中传入一个Parcelable对象;例如传入一个bitmap对象。 代

    Android应用开发详解

    在Android应用开发详解中,我们将深入探讨Android操作系统平台上的应用程序设计和实现。Android是一个开源的移动设备操作系统,由Google领导的开放手机联盟开发并维护。它为开发者提供了丰富的API和工具,可以创建...

    Java Serializable和Parcelable详解及实例代码

    `Parcelable`的优势在于它的序列化和反序列化过程是在内存中进行的,因此速度比`Serializable`快得多,适合在Android应用内部传递对象,特别是在Activity之间传递大数据量的Parcelable对象时,性能提升尤为显著。...

    android四大组件详解

    【Android 四大组件详解】 Android 开发中的四大组件是构建应用程序的核心元素,它们分别是 Activity、Service、BroadcastReceiver 和 ContentProvider。这些组件各自扮演着不同的角色,为应用程序提供丰富的功能和...

    Android中Messenger原理及基本用法详解

    这边博客主要记录一下Android中Messenger的基本原理和用法。 简单来讲,Messenger其实就是Binder通信的包装器,是一种基于消息传递的进程间通信工具。 //Messenger实现了Parcelable接口,因此可以跨进程传输 public...

Global site tag (gtag.js) - Google Analytics