Sobes.tech
Junior

Comment transférer des données d'une Activity à une autre?

sobes.tech IA

Réponse de l'IA

Méthodes de transfert de données:

  1. Extras d'Intent: La méthode la plus courante. Les données sous forme de paires clé-valeur sont ajoutées à l'Intent.

    // Dans l'Activity émettrice
    Intent intent = new Intent(this, TargetActivity.class);
    intent.putExtra("key_string", "Bonjour!");
    intent.putExtra("key_int", 42);
    intent.putExtra("key_boolean", true);
    startActivity(intent);
    
    // Dans l'Activity réceptrice
    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); // Avec valeur par défaut
    }
    

    Types supportés : primitifs, String, Bundle, Parcelable, Serializable. Pour des objets complexes, privilégier Parcelable.

  2. ViewModel (avec LiveData ou Channel): Adapté pour des scénarios plus complexes, où les données doivent être conservées lors de rotations d'écran ou utilisées par plusieurs composants. La transmission de données peut être réalisée via MutableLiveData ou Channel.

    // Dans un ViewModel partagé (par exemple, partagé entre une Activity et des fragments)
    private val _data = MutableLiveData<MyData>()
    val data: LiveData<MyData> = _data
    
    fun setData(newData: MyData) {
        _data.value = newData
    }
    
    // Dans l'Activity/Fragment émetteur
    viewModel.setData(MyData(...))
    
    // Dans l'Activity/Fragment récepteur observant le ViewModel
    viewModel.data.observe(viewLifecycleOwner) { data ->
        // Utiliser les données
    }
    
  3. Callback / Interface (lancement d'une Activity pour résultat): Utilisé lorsque l'Activity réceptrice doit renvoyer un résultat à l'Activity qui l'a lancée.

    // Dans l'Activity émettrice
    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");
                }
            }
        });
    
    // Lancer l'Activity pour résultat
    Intent intent = new Intent(this, TargetActivity.class);
    someActivityResultLauncher.launch(intent);
    
    // Dans l'Activity réceptrice
    Intent resultIntent = new Intent();
    resultIntent.putExtra("result_key", "Résultat");
    setResult(Activity.RESULT_OK, resultIntent);
    finish();
    
  4. Base de données locale / Shared Preferences / Stockage interne: Pour transférer de grandes quantités de données ou des données devant être persistantes. Les données sont écrites dans un stockage dans une Activity et lues dans une autre.

    // Écriture (exemple avec Shared Preferences)
    SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putString("saved_data", "Données sauvegardées");
    editor.apply();
    
    // Lecture (exemple avec Shared Preferences)
    SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
    String savedData = sharedPref.getString("saved_data", null);
    

    Cette approche nécessite une logique supplémentaire pour gérer le cycle de vie des données (quand les effacer).

  5. Singleton / Objet statique global: Non recommandé en raison de problèmes potentiels de fuites de mémoire et de violation de l'architecture. À utiliser uniquement en cas extrême et très simple.

    // Classe 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;
        }
    }
    
    // Dans l'Activity qui envoie
    DataHolder.getInstance().setData("Données via le singleton");
    
    // Dans l'Activity qui reçoit
    String data = DataHolder.getInstance().getData();
    

Le choix de la méthode dépend du volume de données, de leur complexité, de la nécessité de persistance et de l'interaction requise entre Activities. Les approches les plus courantes et recommandées sont Extras d'Intent et ViewModel.