[转]详解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. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值