简体   繁体   English

通过提供者作为额外的意图

[英]Pass Provider as extra of Intent

I have a provider that takes a decent number of properties. 我有一个提供大量属性的提供程序。 For example: 例如:

public MyProvider(
  byte[] image,
  String firstName,
  String nickName,
  String lastName,
  String hairColor,
  String favoriteFood,
  String favoriteColor,
  String cityBorn,
  String stateBorn,
  long favoriteNumber,
  int age,
  String nameOfFather,
  String nameOfMother,
  String nameOfBestFriend
)

I do know that I can get the value of each property, and set each individual one as an extra, like so: 我确实知道我可以获取每个属性的值,并将每个单独的属性都设置为额外属性,如下所示:

Intent myIntent = new Intent(firstActivity.this, secondActivity.class);
myIntent.putExtra("firstName", myProvider.getFirstName().toString());
myIntent.putExtra("nickName", myProvider.getNickName().toString());
...
firstActivity.this.startActivity(myIntent);

I would like to just pass the entire provider as an extra, and then be able to get the provider in the next activity. 我想将整个提供程序作为额外的传递,然后能够在下一个活动中获得该提供程序。 I know it's possible to do such a thing in Swift, but I am not sure how to do so in Java for Android Studio. 我知道可以在Swift中执行此操作,但是我不确定如何在Java for Android Studio中执行此操作。

What I am hoping to be able to do is something like the following: 我希望能够执行的操作类似于以下内容:

MyProvider newPerson = new MyProvider(image, firstName, nickName, lastName, hairColor, favoriteFood, favoriteColor, cityBorn, stateBorn, favoriteNumber, age, nameOfFather, nameOfMother, nameOfBestFriend);
intent.putExtra(newPerson);

But it seems like a provider cannot be passed like this (or possibly at all?). 但是似乎提供者无法像这样(或者可能根本没有通过)传递。

Alternative Attempt: 替代尝试:

  • I also attempted passing it as data like a URI ( see here ), but .setData is specifically for URIs. 我也尝试将它作为URI之类的数据进行传递( 请参阅此处 ),但是.setData是专门用于URI的。

Is there such a way to pass the entire provider as an extra, and then be able to get the provider in the next activity? 有没有一种方法可以让整个提供者额外获得,然后在下一个活动中获得该提供者?

Thanks in advance. 提前致谢。


EDIT 编辑

I have implemented Parcelable as @NabinBhandari and @JuanCruzSoler suggested, but it is causing the following error: 我已经实现Parcelable为@NabinBhandari和@JuanCruzSoler建议,但它导致了以下错误:

Cannot resolve constructor 'MyProvider(byte[], java.lang.String, long)' 无法解析构造函数“ MyProvider(byte [],java.lang.String,长)”

when I call: 当我打电话给:

 MyApartmentsProvider newApartment = new MyApartmentsProvider(image, firstName, favoriteNumber); 

My updated MyProvider.java is as follows: 我更新的MyProvider.java如下:

(note: I cut out some variables for the time being to make the example easier to work with) (注意:我暂时删除了一些变量,以使示例更易于使用)

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

public class MyProvider implements Parcelable {

    /////////////////////////
    // Initializers

    byte[] image;
    String firstName;
    long favoriteNumber;


    // End of [Initializers]
    /////////////////////////

    /////////////////////////
    // Getters

    public byte[] getImage() {
        return image;
    }
    public String getFirstName() {
        return firstName;
    }
    public long getFavoriteNumber() {
        return favoriteNumber;
    }

    // End of [Getters]
    /////////////////////////


    /////////////////////////
    // Setters

    public void setImage(byte[] image) {
        this.image = image;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public void setFavoriteNumber(long favoriteNumber) {
        this.favoriteNumber = favoriteNumber;
    }

    // End of [Setters]
    /////////////////////////


    public MyProvider() {
        super();
    }

    public MyProvider(Parcel parcel) {
        image = new byte[parcel.readInt()];
        parcel.readByteArray(image);
        this.firstName = parcel.readString();
        this.favoriteNumber = parcel.readLong();
    }

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

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeInt(image.length);
        parcel.writeByteArray(image);
        parcel.writeString(this.firstName);
        parcel.writeLong(this.favoriteNumber);
    }

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

        @Override
        public MyProvider[] newArray(int i) {
            return new MyProvider[i];
        }
    };
}

Make your Provider class implement the interface Serializable or Parcelable . 使您的Provider类实现接口SerializableParcelable

Parcelable is faster but Serializable is easier to implement. Parcelable的速度更快,但可Serializable的易于实现。

To send: 发送:

intent.putExtra(KEY, yourObj);

To receive: 接受:

Provider provider = (Provider) getIntent().getSerializableExtra(KEY);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM