传递提供者作为额外的意图
问题描述:
我有一个提供程序,需要适当数量的属性。例如:传递提供者作为额外的意图
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中做这样的事情,但我不确定在Android Studio的Java中如何做到这一点。
什么,我希望能够做的就是像下面这样:
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建议,但它导致了以下错误:
Cannot resolve constructor '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];
}
};
}
答
让您Provider
类实现接口Serializable
或Parcelable
。
Parcelable
更快,但Serializable
更容易实现。
派:
intent.putExtra(KEY, yourObj);
要接收:
Provider provider = (Provider) getIntent().getSerializableExtra(KEY);
你的类实现'Parcelable',然后你可以将它传递到意向 –
“,那么能够得到供应商的下一个活动“ - 使用'Parcelable',你可以在下一个活动中获得提供者的副本*(或者如果你的Parcelable太大,你可能会崩溃)。或者,您可以实现更好的应用程序体系结构,其中两个活动都可以访问提供程序实例而不复制它(例如,具有缓存的存储库)。 – CommonsWare
@CommonsWare,对于'Serializable'是否是同样的问题? – Rbar