传递提供者作为额外的意图

问题描述:

我有一个提供程序,需要适当数量的属性。例如:传递提供者作为额外的意图

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

你的类实现'Parcelable',然后你可以将它传递到意向 –

+2

“,那么能够得到供应商的下一个活动“ - 使用'Parcelable',你可以在下一个活动中获得提供者的副本*(或者如果你的Parcelable太大,你可能会崩溃)。或者,您可以实现更好的应用程序体系结构,其中两个活动都可以访问提供程序实例而不复制它(例如,具有缓存的存储库)。 – CommonsWare

+0

@CommonsWare,对于'Serializable'是否是同样的问题? – Rbar

让您Provider类实现接口SerializableParcelable

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

派:

intent.putExtra(KEY, yourObj); 

要接收:

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

但是Parcelable更快.. –

+1

@JuanCruzSoler注意和编辑。 –

+0

在我们说话的时候给予实施parcelable一枪! – Rbar