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]1
[https://developer.android.com/reference/android/os/Parcel.html]2