Android中intent传递对象和Bundle的用法

来源:互联网 发布:java基础实例 编辑:程序博客网 时间:2024/05/17 07:45

android中的组件间传递的对象一般实现Parcelable接口,当然也可以使用java的Serializable接口,前者是android专门设计的,效率更高,下面我们就来实现一个Parcelabel。

1.序列化

  • 作用:序列化是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。即:序列化是一种能比较好的保存对象状态的机制;
  • 优点:
    1、永久性的保存对象,保存对象的字节序列到本地文件中;
    2、通过序列化对象在网络中传递对象;
    3、通过序列化在进程中传递对象;
  • 序列化方法:
    1、实现Serializable 接口 —- JAVA SE 本身支持的;
    2、实现Parcelable 接口 —- Android 特有的功能,效率比前者的高

*选取序列化方法的原因:
1、在使用内存的时候,Parcelable 类比 Serializable 性能高;
2、Serializable 在序列化的时候会产生大量的临时变量,从而引起频繁的GC;
3、Parcelable 不能使用在要将数据储存在磁盘上的情况,因为Parcelable 不能很好的保证数据的持续性,在外界有变化的情况下;
* 使用方法:
1、Serializable 的实现,只需要实现Serializable 这个接口就行,系统会自动的序列化;
2、Parcelable 序列化实现:
a、声明实现接口Parcelable
b、实现Parcelable 的方法 writeToParcel ,将你的对象序列化为一个Parcel对象;
c、实例化静态内部对象CREATOR,实现接口 Parcelable.Creator
public static final Parcelable.Creator CREATOR ,注意:public staticfinal 一个不能少,内部对象CREATOR 的名称也不能改变,必须全部大写;
d、完成了CREATOR 的代码,实现方法createFromParcel ,将 Parcel 对象反序列化为你的对象;
提示:通过writeToParcel 将你的对象映射成Parcel 对象,再通过createFromParcel将parcel映射成你的对象,也可以将Parcel看成是一个流,通过writeToParcel 把对象写到流里面,在通过createFromParcel 把对象从流里面读取对象,只不过这个过程需要自己来实现,

2. 创建一个类实现Parcelable接口,具体实现如下:

  • package com.hebaijun.testparcelable;
    import android.os.Parcel;
    import android.os.Parcelable;
    public class ParcelableData implements Parcelable{
    private String name;
    private int age;
    public ParcelableData(){
    name = “guest”;
    age = 20;
    }
    public ParcelableData(Parcel in){
    //顺序要和writeToParcel写的顺序一样
    name = in.readString();
    age = in.readInt();
    }
    public String getName(){
    return name;
    }
    public void setName(String name){
    this.name = name;
    }
    public int getAge(){
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }
    @Override
    public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
    // TODO Auto-generated method stub
    dest.writeString(name);
    dest.writeInt(age);
    }
    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    public ParcelableData createFromParcel(Parcel in) {
    return new ParcelableData(in);
    }
    public ParcelableData[] newArray(int size) {
    return new ParcelableData[size];
    }
    };

}

3. 通过下面的方法发送对象。Bundle类也实现了Parcelable接口,一般在android中我们是通过Bundle来封装数据并进行传送的。

  • Intent intent = new Intent();
    intent.setClass(this, SubActivity.class);
    // 直接添加
    //intent.putExtra(“MyData”, new ParcelableData());
    // 通过Bundle
    Bundle bundle = new Bundle();
    bundle.putString(“MyString”, “test bundle”);
    bundle.putParcelable(“MyData”, new ParcelableData());
    intent.putExtras(bundle);
    startActivity(intent);

4. 下面的接收对象的方法。

Bundle bundle = getIntent().getExtras();
ParcelableData parcelableData = bundle.getParcelable(“MyData”);
String testBundleString = bundle.getString(“MyString”);
Log.v(“string=”, testBundleString);
Log.v(“name=”, parcelableData.getName());
Log.v(“age=”, “”+parcelableData.getAge());

0 0
原创粉丝点击