La navigation entre les différentes interfaces utilisateur et le transfert de données associées reposent principalement sur le composant Intent dans l'écosystème Android. Ce mécanisme permet de déclencher une nouvelle Activity tout en y injectant des paramètres spécifiques.
Initialisation et envoi des paramètres
Pour transmettre des informations vers une destination, il faut instancier un objet Intent explicite et y attacher les charges utiles via des paires clé-valeur. L'approche moderne en Kotlin utilise des extensions pour simplifier cette syntaxe.
val destinationIntent = Intent(this, DestinationScreen::class.java).apply {
putExtra("USER_IDENTIFIER", 42)
putExtra("SESSION_TOKEN", "abc123xyz")
}
startActivity(destinationIntent)
Extraction des données dans la cible
Une fois la nouvelle interface affichée, le système d'exploitation injecte l'objet Intent initial. Il suffit alors d'interroger les propriétés pour récupérer les valeurs en utilisant les clés définies précédemment.
val userId = intent.getIntExtra("USER_IDENTIFIER", -1)
val token = intent.getStringExtra("SESSION_TOKEN")
if (userId != -1 && !token.isNullOrEmpty()) {
// Initialiser l'interface avec les données reçues
}
Récupération d'un résultat avec l'API moderne
L'ancienne méthode onActivityResult est désormais déconseillée. Il est préférable d'utiliser l'API ActivityResult qui offre une meilleure gestion du cycle de vie et un typage plus strict.
Dans l'activité appelante, on enregistre un lanceur (launcher) :
val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val returnedData = result.data?.getStringExtra("MODIFIED_PAYLOAD")
// Traiter la donnée renvoyée par l'écran secondaire
}
}
// Déclenchement
val intent = Intent(this, SecondaryScreen::class.java)
resultLauncher.launch(intent)
Du côté de l'activité secondaire, la réponse est configurée avant la fermeture :
val responseIntent = Intent().apply {
putExtra("MODIFIED_PAYLOAD", "nouvelle_valeur")
}
setResult(Activity.RESULT_OK, responseIntent)
finish()
Contraintes de sérialisation et limites de mémoire
Le mécanisme de transfert par Intent utilise le Binder d'Android, qui impose une limite stricte de taille (généralement 1 Mo pour l'ensemble du buffer de transaction). Tenter de faire transiter des images volumineuses ou de larges collections provoquera une TransactionTooLargeException. Pour les objets complexes, l'implémentation de l'interface Parcelable est requise, bien que le passage par un ViewModel partagé, une base de données locale ou un cache en mémoire soit recommandé pour les volumes importants.
Sécurisation des échanges
L'utilisation d'Intents implicites ou l'exposition d'activités via l'attribut android:exported="true" dans le manifeste peut créer des failles si des données sensibles y transitent sans chiffrement. Il est crucial de restreindre les composants exportés, d'utiliser des permissions personnalisées pour protéger les points d'entrée, et de privilégier les Intents explicites pour les navigations internes afin d'éviter l'interceptoin par des applications tierces malveillantes.