Processus et cycle de vie d'une application
Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
Dans la plupart des cas, chaque application Android s'exécute dans son propre processus Linux.
Ce processus est créé pour l'application lorsqu'une partie de son code doit s'exécuter et reste en cours d'exécution jusqu'à ce que le système ait besoin de récupérer sa mémoire pour l'utiliser par d'autres applications et qu'il ne soit plus nécessaire.
Une caractéristique inhabituelle et fondamentale d'Android est que la durée de vie d'un processus d'application n'est pas contrôlée directement par l'application elle-même.
Au lieu de cela, il est déterminé par le système en fonction d'une combinaison des parties de l'application que le système sait en cours d'exécution, de l'importance de ces éléments pour l'utilisateur et de la quantité de mémoire globale disponible dans le système.
Il est important que les développeurs d'applications comprennent l'impact des différents composants d'application (en particulier Activity
, Service
et BroadcastReceiver
) sur la durée de vie du processus de l'application. Si vous n'utilisez pas correctement ces composants, le système peut interrompre le processus de l'application alors qu'il effectue une tâche importante.
Un exemple courant de bug de cycle de vie de processus est un BroadcastReceiver
qui démarre un thread lorsqu'il reçoit un Intent
dans sa méthode BroadcastReceiver.onReceive()
, puis qui revient de la fonction. Une fois qu'il est renvoyé, le système considère que le BroadcastReceiver
n'est plus actif et que son processus d'hébergement n'est plus nécessaire, sauf si d'autres composants d'application y sont actifs.
Par conséquent, le système peut arrêter le processus à tout moment pour récupérer de la mémoire. Il arrête ainsi le thread généré en cours d'exécution dans le processus. La solution à ce problème consiste généralement à planifier un JobService
à partir du BroadcastReceiver
afin que le système sache qu'une tâche active est en cours dans le processus.
Pour déterminer les processus à arrêter en cas de manque de mémoire, Android place chaque processus dans une hiérarchie d'importance en fonction des composants qui s'exécutent dans ces processus et de leur état. Par ordre d'importance, ces types de processus sont les suivants:
- Un processus de premier plan est celui qui est requis pour ce que l'utilisateur fait actuellement. Différents composants d'application peuvent entraîner la considération du processus contenant comme premier plan de différentes manières. Un processus est considéré comme étant au premier plan si l'une des conditions suivantes est remplie :
Il n'y a jamais que quelques processus de ce type dans le système, et ils ne sont arrêtés qu'en dernier recours si la mémoire est si faible que même ces processus ne peuvent plus continuer à s'exécuter. En règle générale, si cela se produit, l'appareil a atteint un état de pagination de mémoire. Cette action est donc nécessaire pour que l'interface utilisateur reste réactive.
- Un processus visible effectue une tâche dont l'utilisateur est actuellement conscient. L'arrêt de ce processus a donc un impact négatif notable sur l'expérience utilisateur. Un processus est considéré comme visible dans les conditions suivantes :
- Il exécute un
Activity
visible à l'écran par l'utilisateur, mais pas au premier plan (sa méthode onPause()
a été appelée). Cela peut se produire, par exemple, si l'Activity
au premier plan est affiché sous forme de boîte de dialogue qui permet de voir l'Activity
précédent derrière elle.
- Il dispose d'un
Service
exécuté en tant que service de premier plan, via Service.startForeground()
(qui demande au système de traiter le service comme quelque chose que l'utilisateur connaît, ou essentiellement comme s'il était visible).
- Il héberge un service que le système utilise pour une fonctionnalité particulière que l'utilisateur connaît, comme un fond d'écran animé ou un service de saisie.
Le nombre de ces processus exécutés dans le système est moins limité que celui des processus de premier plan, mais reste relativement contrôlé. Ces processus sont considérés comme extrêmement importants et ne sont pas arrêtés, sauf si cela est nécessaire pour maintenir tous les processus de premier plan en cours d'exécution.
- Un processus de service est un processus qui détient un
Service
démarré avec la méthode startService()
. Bien que ces processus ne soient pas directement visibles par l'utilisateur, ils effectuent généralement des tâches qui l'intéressent (telles que l'importation ou le téléchargement de données réseau en arrière-plan). Par conséquent, le système maintient toujours ces processus en cours d'exécution, sauf s'il n'a pas suffisamment de mémoire pour conserver tous les processus de premier plan et visibles.
Les services qui s'exécutent depuis longtemps (par exemple, 30 minutes ou plus) peuvent être déclassés pour que leur processus soit ajouté à la liste mise en cache.
Les processus qui doivent être exécutés sur une longue période peuvent être créés avec setForeground
.
S'il s'agit d'un processus périodique qui nécessite un temps d'exécution strict, il peut être planifié via AlarmManager
.
Pour en savoir plus, consultez la page Compatibilité avec les nœuds de calcul de longue durée.
Cela permet d'éviter les situations où des services de longue durée qui utilisent des ressources excessives, par exemple en cas de fuite de mémoire, empêchent le système de fournir une bonne expérience utilisateur.
- Un processus mis en cache est un processus qui n'est pas actuellement nécessaire. Le système est donc libre de le fermer si nécessaire lorsque des ressources telles que la mémoire sont nécessaires ailleurs. Dans un système qui se comporte normalement, ce sont les seuls processus impliqués dans la gestion des ressources.
Un système bien géré dispose de plusieurs processus mis en cache toujours disponibles pour un basculement efficace entre les applications et ferme régulièrement les applications mises en cache si nécessaire.
Seuls les cas très critiques peuvent amener le système à supprimer tous les processus mis en cache et à commencer à supprimer les processus de service.
Étant donné que le système peut arrêter les processus mis en cache à tout moment, les applications doivent cesser toute activité lorsqu'elles sont dans cet état. Si l'application doit effectuer une tâche critique pour l'utilisateur, elle doit utiliser l'une des API ci-dessus pour exécuter la tâche à partir d'un état de processus actif.
Les processus mis en cache contiennent souvent une ou plusieurs instances Activity
qui ne sont pas actuellement visibles par l'utilisateur (leur méthode onStop()
a été appelée et a renvoyé).
S'ils implémentent correctement leur cycle de vie Activity
lorsque le système arrête ces processus, cela n'a aucune incidence sur l'expérience utilisateur lorsqu'il revient à cette application. Il peut restaurer l'état précédemment enregistré lorsque l'activité associée est recréée dans un nouveau processus. Sachez que l'appel de onDestroy()
n'est pas garanti si un processus est arrêté par le système.
Pour en savoir plus, consultez Activity
.
À partir d'Android 13, un processus d'application peut recevoir un temps d'exécution limité ou aucun jusqu'à ce qu'il passe à l'un des états de cycle de vie actifs ci-dessus.
Les processus mis en cache sont conservés dans une liste. La règle d'ordre exacte pour cette liste est un détail d'implémentation de la plate-forme. En général, il essaie de conserver les processus les plus utiles, tels que ceux qui hébergent l'application d'accueil de l'utilisateur ou la dernière activité qu'il a vue, avant les autres types de processus. D'autres règles d'arrêt des processus peuvent également être appliquées, comme la définition de limites strictes sur le nombre de processus autorisés ou la limitation de la durée pendant laquelle un processus peut rester en cache en continu.
Pour décider de la classification d'un processus, le système se base sur le niveau le plus important parmi tous les composants actuellement actifs dans le processus.
Pour en savoir plus sur la façon dont chacun de ces composants contribue au cycle de vie global d'un processus et d'une application, consultez la documentation sur Activity
, Service
et BroadcastReceiver
.
La priorité d'un processus peut également être augmentée en fonction des autres dépendances qu'il a. Par exemple, si le processus A est lié à un Service
avec l'indicateur Context.BIND_AUTO_CREATE
ou utilise un ContentProvider
dans le processus B, la classification du processus B est toujours au moins aussi importante que celle du processus A.
Le contenu et les exemples de code de cette page sont soumis aux licences décrites dans la Licence de contenu. Java et OpenJDK sont des marques ou des marques déposées d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/07/27 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Il n'y a pas l'information dont j'ai besoin","missingTheInformationINeed","thumb-down"],["Trop compliqué/Trop d'étapes","tooComplicatedTooManySteps","thumb-down"],["Obsolète","outOfDate","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Mauvais exemple/Erreur de code","samplesCodeIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 2025/07/27 (UTC)."],[],[],null,["# Processes and app lifecycle\n\nIn most cases, every Android application runs in its own Linux process.\nThis process is created for the application when some of its code needs to\nrun and remains running until the system needs to reclaim its memory for use\nby other applications and it is no longer needed.\n\nAn unusual and fundamental feature of Android is that an application process's\nlifetime *isn't* directly controlled by the application itself.\nInstead, it is determined by the system through a combination of the parts of the application\nthat the system knows are running, how important these things are to the user,\nand how much overall memory is available in the system.\n\nIt is important that\napplication developers understand how different application components\n(in particular [Activity](/reference/android/app/Activity), [Service](/reference/android/app/Service),\nand [BroadcastReceiver](/reference/android/content/BroadcastReceiver)) impact the lifetime\nof the application's process. **Not using these components correctly can\nresult in the system killing the application's process while it is doing\nimportant work.**\n\nA common example of a process lifecycle bug is a\n`BroadcastReceiver` that starts a thread when it\nreceives an `Intent` in its [BroadcastReceiver.onReceive()](/reference/android/content/BroadcastReceiver#onReceive(android.content.Context, android.content.Intent))\nmethod and then returns from the function. Once it returns, the system\nconsiders the `BroadcastReceiver` to no longer be active, and its hosting\nprocess to no longer be needed, unless other application components are active in\nit.\n\n\nSo, the system can kill the process at any time to reclaim memory, and in doing so,\nit terminates the spawned thread running in the process. The solution to this problem\nis typically to schedule a [JobService](/reference/android/app/job/JobService)\nfrom the `BroadcastReceiver` so the\nsystem knows that there is active work occurring in the process.\n\nTo determine which processes to kill when low on memory, Android\nplaces each process into an importance hierarchy based on the components running in\nthem and the state of those components. In order of importance, these process types are:\n\n1. A **foreground process** is one that is required for what the user is currently doing. Various application components can cause its containing process to be considered foreground in different ways. A process is considered to be in the foreground if any of the following conditions hold:\n - It is running an [Activity](/reference/android/app/Activity) at the top of the screen that the user is interacting with (its [onResume()](/reference/android/app/Activity#onResume()) method has been called).\n - It has a [BroadcastReceiver](/reference/android/content/BroadcastReceiver) that is currently running (its [BroadcastReceiver.onReceive()](/reference/android/content/BroadcastReceiver#onReceive(android.content.Context, android.content.Intent)) method is executing).\n - It has a [Service](/reference/android/app/Service) that is currently executing code in one of its callbacks ([Service.onCreate()](/reference/android/app/Service#onCreate()), [Service.onStart()](/reference/android/app/Service#onStart(android.content.Intent, int)), or [Service.onDestroy()](/reference/android/app/Service#onDestroy())).\n2. There are only ever a few such processes in the system, and these are only killed as a last resort if memory is so low that not even these processes can continue to run. Generally, if this happens the device has reached a memory paging state, so this action is required to keep the user interface responsive.\n3. A **visible process** is doing work that the user is currently aware of, so killing it has a noticeable negative impact on the user experience. A process is considered visible in the following conditions:\n - It is running an [Activity](/reference/android/app/Activity) that is visible to the user on-screen but not in the foreground (its [onPause()](/reference/android/app/Activity#onPause()) method has been called). This might occur, for example, if the foreground `Activity` is displayed as a dialog that lets the previous `Activity` be seen behind it.\n - It has a [Service](/reference/android/app/Service) that is running as a foreground service, through [Service.startForeground()](/reference/android/app/Service#startForeground(int, android.app.Notification)) (which asks the system to treat the service as something the user is aware of, or essentially as if it were visible).\n - It is hosting a service that the system is using for a particular feature that the user is aware of, such as a live wallpaper or an input method service.\n\n The number of these processes running in the system is less bounded than foreground\n processes, but still relatively controlled. These processes are\n considered extremely important and aren't killed unless doing so is\n required to keep all foreground processes running.\n4. A **service process** is one holding a [Service](/reference/android/app/Service) that has been started with the [startService()](/reference/android/content/Context#startService(android.content.Intent)) method. Though these processes are not directly visible to the user, they are generally doing things that the user cares about (such as background network data upload or download), so the system always keeps such processes running unless there is not enough memory to retain all foreground and visible processes.\n\n Services that have been running for a long time (such as 30 minutes or more) might be\n demoted in importance to let their process drop to the cached list.\n\n Processes that do need to be run over a long period can be created with\n [setForeground](/reference/kotlin/androidx/work/CoroutineWorker#setForeground(androidx.work.ForegroundInfo)).\n If it is a periodic process that requires strict time of execution, it can be\n scheduled through the [AlarmManager](/reference/android/app/AlarmManager).\n For more information, refer to [Support for long-running workers](/topic/libraries/architecture/workmanager/advanced/long-running).\n This helps avoid situations where long-running services that use excessive resources, for\n example, by leaking memory, prevent the system from delivering a good user experience.\n5. A **cached process** is one that is not currently needed, so the system is free to kill it as needed when resources like memory are needed elsewhere. In a normally behaving system, these are the only processes involved in resource management.\n\n \u003cbr /\u003e\n\n A well-running system has multiple cached processes always available, for efficient\n switching between applications, and regularly kills the cached apps as needed.\n Only in very critical situations does the system get to a point where\n all cached processes are killed and it must start killing service processes.\n\n Since cached processes can be killed by the system at any time, apps should cease all work while\n in the cached state. If user-critical work must be performed by the app,\n it should use one of the above APIs to run work from an active process state.\n\n Cached processes often hold one or more [Activity](/reference/android/app/Activity) instances\n that are not currently visible to the user (their\n [onStop()](/reference/android/app/Activity#onStop()) method has been called and has returned).\n Provided they implement their `Activity` lifecycle correctly when the system\n kills such processes, it doesn't impact the user's experience when returning to that app.\n It can restore the previously saved state when the associated activity recreates in\n a new process. Be aware that [onDestroy()](/guide/components/activities/activity-lifecycle#ondestroy)\n is not guaranteed to be called in the case that a process is killed by the system.\n For more details, see [Activity](/reference/android/app/Activity).\n\n Starting in Android 13, an app process may receive limited or no execution time until it enters\n one of the above active lifecycle states.\n\n Cached processes are kept in a list. The exact ordering policy for this list\n is an implementation detail of the platform. Generally, it tries to keep more\n useful processes, such as those hosting the user's home application or the last activity the user saw,\n before other types of processes. Other policies for killing processes can also\n be applied, like setting hard limits on the number of processes allowed or limiting the amount of\n time a process can stay continually cached.\n\nWhen deciding how to classify a process, the system bases its decision on the most\nimportant level found among all the components currently active in the process.\nSee the [Activity](/reference/android/app/Activity), [Service](/reference/android/app/Service), and\n[BroadcastReceiver](/reference/android/content/BroadcastReceiver) documentation for more detail on how\neach of these components contributes to the overall lifecycle of a process and of\nthe application.\n\nA process's priority might also be increased based on other dependencies\na process has to it. For example, if process A has bound to a\n[Service](/reference/android/app/Service) with\nthe [Context.BIND_AUTO_CREATE](/reference/android/content/Context#BIND_AUTO_CREATE)\nflag or is using a\n[ContentProvider](/reference/android/content/ContentProvider) in process B, then process B's\nclassification is always at least as important as process A's."]]