Sobes.tech
Junior

¿Cómo transferir datos de una Activity a otra?

sobes.tech AI

Respuesta de la IA

Formas de transferencia de datos:

  1. 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 prefieren Parcelable.

  2. 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 MutableLiveData o Channel.

    // 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
    }
    
  3. 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();
    
  4. 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).

  5. 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.