«

Andorid学习之路(七)之 Serializable接口和Parcelable接口

时间:2024-3-2 17:11     作者:韩俊     分类: Html+Css


Activity之间的数据传输

activity之间的数据传输我们可以通过Intent对象的putExtra方法,通过这个可以传输很多不同类型的数据,比如说字符串、整数、实数、对象等。

首先以一个字符串举例来说一下:

通过putExtra传输字符串可以通过如下方法:

putExtra(String name, String value):intent

第一个参数为用来让接收数据的activity辨别的字符串,相当于HashMap中的索引值。

第二个为要发送的数据(这里是字符串)。

在目标activity中通过这个name来找到这个value。

当前activity中:

String str = "你好";
intent.putExtra("data", str);

目标activity中:

Bundle bundle = getIntent().getExtras();
String str = bundle.getString("data");

上面只是简单的说明一下如何传输字符串。

那么如何传输对象呢?这货比较特殊,不能像putExtra("data", Object)这样进行传输,没有这种方法。

在重载方法中可以找到两个比较特殊的方法:

putExtra(String name, Serializable value):intent

putExtra(String name, Parcelable value):intent

Serializable和Parcelable分别是两个接口,那么要传输对象,则只需要使得类实现这两个接口之一就行了。

我们先来看一下Serializable实现,创建一个类Obj并且实现该接口:

import java.io.Serializable;

public class Obj implements Serializable{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

当前activity:

Obj obj = new Obj();
obj.setName("李刚");
intent.putExtra("data", obj);

目标activity:

Bundle bundle = getIntent().getExtras();
Obj obj = (Obj) bundle.get("data");
String name = obj.getName();

再来看一下Parcelable实现,创建一个类Obj2并且实现该接口:

import android.os.Parcel;
import android.os.Parcelable;

public class Obj2 implements Parcelable{

    private String name;
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

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

    /*
     * 创建CREATOR常量(必须要这样做)
     * */
    public static Parcelable.Creator<Obj2> CREATOR = new Creator<Obj2>() {

        @Override
        public Obj2[] newArray(int size) {
            return null;
        }

        /*
         * 重写createFromParcel方法
         * */
        @Override
        public Obj2 createFromParcel(Parcel source) {
            //通过读取Parcel类对象的属性,来set当前类的属性
            Obj2 obj2 = new Obj2();
            obj2.setName(source.readString());
            obj2.setAge(source.readString());
            return obj2;
        }
    };

    /*将对象属性保存到Parcel类对象中*/
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(age);
    }
}

看起来是不是要比实现Serializable接口要复杂的多?但是这种方法要好多的,主要是该方法速度快,性能好(一般用这种)。

当前activity:

Obj2 obj2 = new Obj2();
obj2.setName("李刚");
obj2.setAge("38岁");
intent.putExtra("s1", obj2);

目标activity:

Bundle bundle = getIntent().getExtras();
Obj2 obj2 = (Obj2) bundle.get("s1");
String name = obj2.getName();
String age = obj2.getAge();

以上就是两种实现对象传输的方法。


THE END~



标签: javascript html css

热门推荐