Android——Bundle浅析

Bundle主要用于传输数据,以key-value的形式存储数据。

  • Bundle常用于在Activity间传递数据
  • 当bundle传递的是对象或对象数组时,必须实现Serializable或Parcelable接口,

下面分别介绍bundle在activity间如何传递基本数据类型和对象。

传递方法:

举个例子:
写数据:

	Bundle bundle=new Bundle();
    bundle.putString("name","police");
    bundle.putInt("years",8);
    final Intent intent=new Intent().setClassName("police.myapp","police.myapp.Main2Activity");
    intent.putExtras(bundle);
    startActivity(intent);

执行后将bundle绑定到intent,传递到Mian2Activity
读数据:

    Bundle bundle=this.getIntent().getExtras();
    String bundleString=bundle.getString("name");
    int bundleInt=bundle.getInt("years");
    textView.setText(bundleString+bundleInt);

Parcelable类型的对象
Parcelable是Android自定义的一个接口,它包括将数据写入Parcel和从Parcel中读出的API。一个实体(用类来表示),如果需要封装到Bundle中去,可以通过实现Parcelable接口来完成。
Android——Bundle浅析_第1张图片

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

1.实现Parcelable接口

看看一个官方给出的例子:

注意:对象中定义的CREATOR不可以改为其他名字噢

public class MyParcelable implements Parcelable {
     
    private int mData;

    public int describeContents() {
     
        return 0;
    }

    public void writeToParcel(Parcel out, int flags) {
     
        out.writeInt(mData);
    }

    public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {
     
        public MyParcelable createFromParcel(Parcel in) {
     
            return new MyParcelable(in);
        }

        public MyParcelable[] newArray(int size) {
     
            return new MyParcelable[size];
        }
    };

    private MyParcelable(Parcel in) {
     
        mData = in.readInt();
    }
}

这个例子中的对象只包含了一个属性mData,我们再看一个例子

public class User implements Parcelable {
     
    private String name;
    private int age;

    public User(String name, int age) {
     
        this.name = name;
        this.age = age;
    }

    protected User(Parcel in) {
     
        name = in.readString();
        age = in.readInt();
    }

    public static final Creator<User> CREATOR = new Creator<User>() {
     
        @Override
        public User createFromParcel(Parcel in) {
     
            return new User(in);
        }

        @Override
        public User[] newArray(int size) {
     
            return new User[size];
        }
    };

    @Override
    public int describeContents() {
     
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
     
        dest.writeString(name);
        dest.writeInt(age);
    }

    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 String toString() {
     
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

2.传递Parcelable对象并解析

传递:

User user = new User("shellhub", 23);
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra(KEY, user);
startActivity(intent);

解析:

User user = getIntent().getExtras().getParcelable(KEY);

因为方法实现了泛型,所以不需要类型转换
public T getParcelable(@Nullable String key) {

你可能感兴趣的:(Android)