Android Como enviar parámetros entre Activities usando Parcelable

Porque usar Parcelable

Para enviar objetos entre Activities tienes dos formas convenientes.

Una de ellas es enviando un objeto Serializable y la segunda es enviando un Parcelable.

La serialización en Android es bastante lenta y no se recomienda para el envío de objetos entre Activities. Por esto Android creo Parcelable para resolver este problema. Parcelable es mucho más rápido que la serialización estándar aunque su implementación requiere un poco más de trabajo.

A menos que tu objeto sea muy ‘pequeño’ es mejor que implementes siempre Parcelable cuando que necesites enviar un objeto entre Activities.

Cómo definir un objeto Parcelable en android

Dijimos que la mejor opción para pasar objetos entre Activities es implementar interfaz Parcelable.

Observa que en Parcelable debes definir

void writeToParcel(Parcel dest, int flags), 
int describeContents()

También establecer un constructor que reciba el Parcel y un Creator

protected Product(Parcel in) {...}
public static final Creator<Product> CREATOR = new Creator<Product>() {...}

Es importante que respetes el mismo orden de write y read. Es decir si escribiste en primer lugar el id debes leerlo tambien en primer lugar.

Mira como leer y escribir un booleano en el Parcelable.

….
available = in.readByte() != 0;
...
 dest.writeByte((byte) (available ? 1 : 0));
...

Siempre un ejemplo es mejor.

public class Product implements Parcelable {

   private long productId;
   private String name;
   private String description;
   private boolean available;

   public Product() {
   }

   protected Product(Parcel in) {
       productId = in.readLong();
       name = in.readString();
       description = in.readString();
       available = in.readByte() != 0;
   }

   @Override
   public void writeToParcel(Parcel dest, int flags) {
       dest.writeLong(productId);
       dest.writeString(name);
       dest.writeString(description);
       dest.writeByte((byte) (available ? 1 : 0));
   }

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

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

       @Override
       public Product[] newArray(int size) {
           return new Product[size];
       }
   };

Cómo enviar un parámetro Parcelable entre Activities en android

Necesitas declarar un Intent y cargar un ‘extra data’

public class MainActivity extends AppCompatActivity {

   public static final String PRODUCT_KEY = "PRODUCT_KEY";

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       Product product = createProduct();

       Intent intent = new Intent(this, SecondActivity.class);
       intent.putExtra(PRODUCT_KEY, product);

       startActivity(intent);

   }

   // for the purpose of this example
   private Product createProduct() {
       Product product = new Product();
       product.setProductId(123l);
       product.setName("Android");
       product.setDescription("Android Mobile");
       product.setAvailable(true);
       return product;
   }

}

Cómo recibir un parámetro Parcelable entre Activities en android

Aquí necesitas obtener el intent y leer getParcelableExtra()

public class SecondActivity extends AppCompatActivity {

   private TextView productId;
   private TextView productName;
   private TextView productDescription;
   private TextView productAvailable;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_second);

       initializeViews();

       Product product = getIntent().getParcelableExtra(MainActivity.PRODUCT_KEY);
       if(product != null) {
           updateTextViews(product);
       }else {
           Toast.makeText(this, "NO product to show ", Toast.LENGTH_LONG).show();
       }

   }

   private void initializeViews() {
       productId = (TextView) findViewById(R.id.productId);
       productName = (TextView) findViewById(R.id.productName);
       productDescription = (TextView) findViewById(R.id.productDescription);
       productAvailable = (TextView) findViewById(R.id.productAvailable);
   }

   private void updateTextViews(Product product) {
       productId.setText(String.valueOf(product.getProductId()));
       productName.setText(product.getName());
       productDescription.setText(product.getDescription());
       productAvailable.setText(String.valueOf(product.isAvailable()));
   }

}

Referencias

https://developer.android.com/reference/android/os/Parcelable.html

https://developer.android.com/reference/android/os/Parcel.html

Descarga este código completo