Intent传递对象

作者: 我想吃碗牛肉面 | 来源:发表于2017-08-16 09:41 被阅读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");
    

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

    相关文章

      网友评论

      • ChineseBoy:最好别传大数据,有限制的,毕竟是bundle实现的
        我想吃碗牛肉面:@ChineseBoy 是的,网上查询的限制大小是小于1M,如果太大就通过本地存储传递。

      本文标题:Intent传递对象

      本文链接:https://www.haomeiwen.com/subject/ruwbrxtx.html