¿Cómo transferir datos de una Activity a otra?
sobes.tech AI
Respuesta de la IA
Formas de transferencia de datos:
-
Extras de Intent: La forma más común. Los datos en forma de pares clave-valor se añaden al
Intent.// En la Activity que envía Intent intent = new Intent(this, TargetActivity.class); intent.putExtra("key_string", "¡Hola!"); intent.putExtra("key_int", 42); intent.putExtra("key_boolean", true); startActivity(intent);// En la Activity que recibe Bundle extras = getIntent().getExtras(); if (extras != null) { String stringData = extras.getString("key_string"); int intData = extras.getInt("key_int"); boolean booleanData = extras.getBoolean("key_boolean", false); // Con valor por defecto }Tipos soportados: primitivos,
String,Bundle,Parcelable,Serializable. Para objetos complejos, se prefierenParcelable. -
ViewModel (junto con LiveData o Channel): Adecuado para escenarios más complejos, donde los datos deben mantenerse durante rotaciones de pantalla o ser utilizados por múltiples componentes. La transmisión de datos puede implementarse mediante
MutableLiveDataoChannel.// En un ViewModel compartido (por ejemplo, compartido entre una Activity y fragmentos) private val _data = MutableLiveData<MyData>() val data: LiveData<MyData> = _data fun setData(newData: MyData) { _data.value = newData }// En la Activity/Fragment que envía viewModel.setData(MyData(...))// En la Activity/Fragment que recibe observando el ViewModel viewModel.data.observe(viewLifecycleOwner) { data -> // Usar los datos } -
Callback / Interface (al iniciar una Activity para resultado): Se usa cuando la Activity receptora debe devolver un resultado a la que inicia.
// En la Activity que envía ActivityResultLauncher<Intent> someActivityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK) { Intent data = result.getData(); if (data != null && data.getExtras() != null) { String resultData = data.getExtras().getString("result_key"); } } }); // Iniciar la Activity para resultado Intent intent = new Intent(this, TargetActivity.class); someActivityResultLauncher.launch(intent);// En la Activity receptora Intent resultIntent = new Intent(); resultIntent.putExtra("result_key", "Resultado"); setResult(Activity.RESULT_OK, resultIntent); finish(); -
Base de datos local / Shared Preferences / Almacenamiento interno: Para transferir grandes volúmenes de datos o datos que deben persistir. Los datos se escriben en un almacenamiento en una Activity y se leen en otra.
// Escritura (ejemplo con Shared Preferences) SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); editor.putString("saved_data", "Datos guardados"); editor.apply();// Lectura (ejemplo con Shared Preferences) SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE); String savedData = sharedPref.getString("saved_data", null);Este método requiere lógica adicional para gestionar el ciclo de vida de los datos (cuándo borrarlos).
-
Singleton / Objeto estático global: No recomendado debido a posibles problemas de fugas de memoria y violaciones de la arquitectura. Úsese solo en casos extremos y muy simples.
// Clase singleton public class DataHolder { private static final DataHolder instance = new DataHolder(); private String data; private DataHolder() {} public static DataHolder getInstance() { return instance; } public String getData() { return data; } public void setData(String data) { this.data = data; } }// En la Activity que envía DataHolder.getInstance().setData("Datos a través del singleton");// En la Activity que recibe String data = DataHolder.getInstance().getData();
La elección del método depende del volumen de datos, su complejidad, la necesidad de persistencia y la interacción requerida entre Activities. Los enfoques más comunes y recomendados son Extras de Intent y ViewModel.