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:
-
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égierParcelable. -
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
MutableLiveDataouChannel.// 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 } -
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(); -
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).
-
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.