欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Android中Parcelable的作用实例解析

程序员文章站 2024-02-27 23:59:15
在android提供了一种类型:parcel。被用作封装数据的容器,封装后的数据可以通过intent或ipc传递。 除了基本类型以外,只有实现了parcelable接口的类...

在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;  
    }  
  };  
 
}