Activity — un composant de base d'une application Android représentant un seul écran avec une interface utilisateur. Le système gère les écrans via un cycle de vie strict — les callbacks onCreate, onResume et onDestroy. Chaque Activity est déclarée dans AndroidManifest.xml et lancée via Intent. En savoir plus sur l'historique d'Android dans la documentation officielle de Google.
Points clés
Activity — un composant clé d'une application Android qui fournit une fenêtre pour l'interaction avec l'utilisateur. Chaque Activity gère un écran séparé : liste de tâches, formulaire de connexion, visualiseur de photos. Le système Android crée une Activity à la demande et la détruit lorsque d'autres applications ont besoin de mémoire.
Activity est apparue pour la première fois dans Android 1.0 (2008) et reste le principal bloc de construction de l'interface. Selon Google (2026), 98% des applications sur Google Play contiennent au moins une Activity. Dans l'architecture moderne, Google recommande une Activity avec plusieurs Fragments, cependant l'application classique multi-écrans reste une pratique courante.
Activity stack (back stack) — une pile de tâches qui stocke l'historique de navigation. Lorsque l'utilisateur appuie sur "Retour", l'Activity actuelle est détruite et la précédente est restaurée. Le système gère la pile automatiquement, mais le développeur peut contrôler le comportement via launchMode et les indicateurs Intent.
Le cycle de vie de Activity est un ensemble d'états et de callbacks par lesquels un écran passe de la création à la destruction. Comprendre le Lifecycle est d'une importance critique : une mauvaise gestion des états entraîne des fuites de mémoire, une perte de données et des plantages de l'application.
Le système Android appelle les callbacks dans un ordre strict. Le développeur surcharge les méthodes nécessaires pour initialiser les ressources, sauvegarder les données et libérer la mémoire. Chaque callback a une paire correspondante : onCreate ↔ onDestroy, onStart ↔ onStop, onResume ↔ onPause.
| Callback | Objectif | Action du développeur |
|---|---|---|
| onCreate | Appelé lors de la création d'Activity | Initialisation de l'UI, abonnement à ViewModel |
| onStart | Activity devient visible | Démarrer animations, caméra, GPS |
| onResume | Activity obtient le focus d'entrée | Reprendre vidéo, minuteurs |
| onPause | Activity perd le focus | Sauvegarder brouillons, arrêter animations |
| onStop | Activity est cachée par un autre écran | Libérer les ressources lourdes |
| onDestroy | Activity est détruite | Nettoyer abonnements, Closeable |
Il existe quatre états de Activity : Running (onResume actif), Paused (visible mais sans focus), Stopped (non visible), Destroyed (détruit). Le système peut tuer une Activity à l'état Stopped en cas de manque de mémoire — les données doivent être sauvegardées dans onSaveInstanceState.
Examinons trois méthodes clés du cycle de vie d'Activity avec un exemple en Kotlin. onCreate — le point d'entrée, appelé une fois. Ici se produisent la liaison du layout via setContentView, l'initialisation de RecyclerView, l'abonnement à LiveData. onStart — l'Activity devient visible pour l'utilisateur. onResume — l'Activity obtient le focus et est prête pour l'interaction.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerView = findViewById<RecyclerView>(R.id.rv_items)
recyclerView.layoutManager = LinearLayoutManager(this)
loadItems()
}
override fun onStart() {
super.onStart()
startLocationUpdates()
}
override fun onResume() {
super.onResume()
resumeVideoPlayer()
}
}Dans l'exemple, onCreate initialise RecyclerView et charge les données. onStart démarre les mises à jour de géolocalisation — une ressource qui ne devrait fonctionner que lorsque l'écran est visible. onResume reprend la vidéo qui a été mise en pause dans onPause. Cette séparation évite le travail inutile en arrière-plan.
Chaque Activity doit être déclarée dans le fichier AndroidManifest.xml. Sans enregistrement, le système ne trouvera pas l'écran et lancera une exception ActivityNotFoundException. Le manifeste spécifie le nom de la classe, le thème, l'orientation, launchMode et les filtres Intent.
<application
android:allowBackup="true"
android:label="@string/app_name"
android:theme="@style/Theme.MyApp">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".DetailActivity"
android:parentActivityName=".MainActivity" />
</application>Le flag exported détermine si d'autres applications peuvent lancer l'Activity. Pour l'écran principal exported=true, pour les écrans internes — false. L'attribut parentActivityName active la navigation standard "Vers le haut" (Up Navigation).
Intent — un objet qui décrit une action à effectuer. Dans le contexte d'Activity, Intent est utilisé pour lancer un autre écran avec transfert de données. Intent peut être explicite (spécifie une classe concrète) et implicite (spécifie une action, le système sélectionne un composant approprié).
// Intent explicite — lancer DetailActivity avec données
val intent = Intent(this, DetailActivity::class.java).apply {
putExtra("item_id", itemId)
putExtra("item_name", itemName)
}
startActivity(intent)
// Obtenir des données dans DetailActivity
val itemId = intent.getLongExtra("item_id", 0L)
val itemName = intent.getStringExtra("item_name") ?: ""Pour obtenir un résultat d'une Activity lancée, on utilise Activity Result API, qui a remplacé l'obsolète startActivityForResult. La nouvelle API est type-safe, déclarative et fonctionne avec Jetpack Compose.
private val getResult = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val data = result.data?.getStringExtra("result_key")
}
}
fun openPicker() {
val intent = Intent(this, PickerActivity::class.java)
getResult.launch(intent)
}Lors de la rotation de l'écran ou du changement de configuration, Android recrée l'Activity — appelle séquentiellement onDestroy et onCreate. Sans sauvegarde d'état, l'utilisateur perd les données saisies, la position de défilement et les éléments sélectionnés. Android fournit deux mécanismes pour résoudre ce problème : onSaveInstanceState et ViewModel.
onSaveInstanceState sauvegarde les données simples dans Bundle avant l'appel à onDestroy. ViewModel de Jetpack survit à la recréation d'Activity et stocke les données en mémoire, ce qui est plus efficace pour les objets complexes et les requêtes réseau.
class MainActivity : AppCompatActivity() {
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ViewModel sauvegarde automatiquement les données
viewModel.items.observe(this) { items ->
updateAdapter(items)
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt("scroll_position", recyclerView.computeVerticalScrollOffset())
}
}L'approche moderne de Google est l'architecture Single Activity avec une Activity et plusieurs Fragments. L'application utilise une MainActivity, et toute la navigation est gérée par Navigation Component via NavHostFragment. Avantages : navigation centralisée, ViewModel partagé par écran, gestion correcte des Deep Links.
Jetpack Navigation Component automatise la gestion de la back stack, les animations de transition et le passage d'arguments. NavHostFragment est placé dans le layout de l'Activity, et le graphe de navigation (NavGraph) décrit tous les écrans et les connexions entre eux. Cette approche est recommandée par Google pour les nouveaux projets et suit les principes de Material Design.
class MainActivity : AppCompatActivity() {
private val navController by lazy {
findViewById<NavHostFragment>(R.id.nav_host_fragment)
.navController
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Configuration de NavigationUI pour AppBar
setupActionBarWithNavController(navController)
}
override fun onSupportNavigateUp() =
navController.navigateUp() || super.onSupportNavigateUp()
}Foire aux questions
Activity — un écran complet d'application avec son propre cycle de vie. Fragment — une partie de l'UI à l'intérieur d'Activity qui survit à la recréation d'Activity et dépend de son Lifecycle. Activity est obligatoire, Fragment est facultatif.
Il n'y a pas de limites. Chaque écran représente généralement une Activity séparée. Pour une application simple une suffit, pour les applications multi-écrans — de 5 à 20. Google recommande une Activity avec plusieurs Fragments.
launchMode détermine comment une Activity est créée dans la pile de tâches. Quatre modes : standard (une nouvelle instance est créée), singleTop, singleTask (une instance par tâche) et singleInstance (tâche isolée). Le mode est défini dans AndroidManifest.xml.
Via Intent — un objet avec des extras (putExtra) pouvant contenir des primitifs, des chaînes, Parcelable ou Serializable. Pour la communication de retour, on utilise Activity Result API — un remplacement moderne type-safe de startActivityForResult.
Configuration Change — recréation d'Activity lors du changement de configuration (rotation d'écran, changement de langue, clavier). Le système appelle onDestroy → onCreate. Pour sauvegarder les données, utilisez onSaveInstanceState ou ViewModel de Jetpack.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi