工具Android开发经验谈Android开发

Intent传递对象

2017-08-16  本文已影响166人  我想吃碗牛肉面

背景
在某些情况下,我们需要使用到Intent去传递一个自定义对象,这样能够减少许多不必要的代码。查阅一下,传递的对象类需要实现Serializable接口或Parcelable接口,下面我们来介绍一下如何选择,及如何传递。

Serializable与Parcelable的选择
Serializable是JavaSE本身就支持的,Parcelable是Android特有功能,效率比实现Serializable接口高效,可用于Intent数据传递,也可以用于进程间通信。Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化。

如果不使用Intent传递对象
发送端:

Intent intent=new Intent(this,GoodsDetailActivity.class);
intent.putExtra(Constants.INTENT_KEY_GOODS_ID,mGoodsList.get(position).getProductCode());
intent.putExtra(Constants.INTENT_KEY_GOODS_IMG_URL,mGoodsList.get(position).getProductUrl());
intent.putExtra(Constants.INTENT_KEY_GOODS_NAME,mGoodsList.get(position).getProductName());
intent.putExtra(Constants.INTENT_KEY_GOODS_PRICE,mGoodsList.get(position).getRetailPrice());
startActivity(intent);

接收端:

String goodsId=getIntent().getStringExtra(Constants.INTENT_KEY_GOODS_ID);
String imgUrl=getIntent().getStringExtra(Constants.INTENT_KEY_GOODS_IMG_URL);
String goodsName=getIntent().getStringExtra(Constants.INTENT_KEY_GOODS_NAME);
String goodsPrice=getIntent().getStringExtra(Constants.INTENT_KEY_GOODS_PRICE);

我们需要传递的只是mGoodsList列表中的一项,若把这一项里的各个数据分开来传递,不仅要定义各数据对应的常量,还写了许多不必要的代码。

使用Intent传递实现Parcelable接口的对象
发送端

GoodsItemEntity goodsItemEntity=new GoodsItemEntity(Parcel.obtain());
goodsItemEntity.setProductName("电视机");

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("item",goodsItemEntity);
startActivity(intent);

接收端

GoodsItemEntity mGoodsItemEntity=getIntent().getParcelableExtra("item");
String productName=mGoodsItemEntity.getProductName();

当然我们传递的这个GoodsItemEntity需要实现接口Parcelable:

public class GoodsItemEntity implements Parcelable {

    private String retailPrice;
    private String productName;
    private String productCode;
    private String productUrl;
    private String productId;

    public String getProductCode() {
        return productCode;
    }

    public void setProductCode(String productCode) {
        this.productCode = productCode;
    }

    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public String getProductUrl() {
        return productUrl;
    }

    public void setProductUrl(String productUrl) {
        this.productUrl = productUrl;
    }

    public String getRetailPrice() {
        return retailPrice;
    }

    public void setRetailPrice(String retailPrice) {
        this.retailPrice = retailPrice;
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(retailPrice);
        dest.writeString(productName);
        dest.writeString(productCode);
        dest.writeString(productUrl);
        dest.writeString(productId);
    }

    public static final Creator<GoodsItemEntity> CREATOR = new Creator<GoodsItemEntity>() {
        @Override
        public GoodsItemEntity[] newArray(int size) {
            return new GoodsItemEntity[size];
        }

        @Override
        public GoodsItemEntity createFromParcel(Parcel in) {
            return new GoodsItemEntity(in);
        }
    };

    public GoodsItemEntity(Parcel in) {
        retailPrice = in.readString();
        productName = in.readString();
        productCode = in.readString();
        productUrl = in.readString();
        productId = in.readString();
    }

}

传递Bitmap
Intent几乎可以实现你想要传递的各种数据,如传递基本数据类型、数组、ArrayList、Bitmap、Intent、Bundle等等,下面是传递Bitmap的一个例子:
发送端:

Intent intent=new Intent(activity,SecondActivity.class);
intent.putExtra("bitmap",bitmap);
activity.startActivity(intent);

接收端:

Bitmap bitmap=getIntent().getParcelableExtra("bitmap");

以上代码均经过验证,有不正之处,请指正

上一篇 下一篇

猜你喜欢

热点阅读