将提供者作为Intent

时间:2017-10-06 17:35:20

标签: java android android-intent android-contentprovider extras

我有一个提供者需要相当数量的属性。例如:

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
)

我知道我可以获得每个属性的值,并将每个属性设置为额外的属性,如下所示:

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

我想将整个提供程序作为额外的提交,然后能够在下一个活动中获取提供程序。我知道可以在Swift中做这样的事情,但我不知道如何在Java for Android Studio中这样做。

我希望能够做的事情如下:

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

但似乎提供者不能像这样传递(或者可能根本没有传递?)。

替代尝试:

  • 我还尝试将其作为URI(see here)之类的数据传递,但.setData专门用于URI。

是否有这样的方法可以将整个提供商作为额外提供商,然后能够在下一个活动中获得提供商?

提前致谢。

修改

我已将Parcelable实现为@NabinBhandari和@JuanCruzSoler建议,但它会导致以下错误:

  

无法解析构造函数' MyProvider(byte [],java.lang.String,long)'

我打电话的时候:

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

我更新的MyProvider.java如下:

(注意:我暂时删除了一些变量以使示例更易于使用)

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

1 个答案:

答案 0 :(得分:1)

让您的Provider课程实施界面SerializableParcelable

Parcelable速度更快,但Serializable更容易实现。

发送:

intent.putExtra(KEY, yourObj);

收到:

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