Processos e ciclo de vida do aplicativo
Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
Na maioria dos casos, cada aplicativo para Android é executado no próprio processo do Linux.
Esse processo é criado para o app quando parte do código precisa ser
executada e permanece em execução até que o sistema precise reivindicar a memória para uso
por outros apps e não seja mais necessário.
Uma característica incomum e fundamental do Android é que o ciclo de vida do processo de um app
não é diretamente controlado pelo próprio app.
Em vez disso, ele é determinado pelo sistema por meio de uma combinação das partes do aplicativo
que o sistema sabe que estão sendo executadas, da importância delas para o usuário
e da quantidade de memória disponível no sistema.
É importante que
os desenvolvedores de apps entendam como componentes de aplicativo diferentes
(em especial Activity
, Service
e BroadcastReceiver
) afetam o ciclo de vida
do processo do aplicativo. Não usar esses componentes corretamente pode
fazer com que o sistema elimine o processo do app enquanto ele estiver fazendo
um trabalho importante.
Um exemplo comum de um bug do ciclo de vida do processo é um
BroadcastReceiver
que inicia uma linha de execução quando
recebe um Intent
no método BroadcastReceiver.onReceive()
e retorna da função. Depois que ele retorna, o sistema
considera que o BroadcastReceiver
não está mais ativo e que o processo de hospedagem
dele não é mais necessário, a menos que outros componentes do aplicativo estejam ativos
nele.
Assim, o sistema pode eliminar o processo a qualquer momento para recuperar a memória e, ao fazer isso,
encerrar a linha de execução gerada no processo. A solução para esse problema
é normalmente programar um JobService
a partir do BroadcastReceiver
para que o
sistema saiba que há trabalho ativo no processo.
Para determinar quais processos precisam ser eliminados quando a memória estiver baixa, o Android
coloca cada processo em uma hierarquia de importância com base nos componentes executados neles
e no estado desses componentes. Em ordem de importância, esses tipos de processo são:
- Um processo em primeiro plano é aquele que é necessário para
o que o usuário está fazendo no momento. Vários componentes de aplicativo podem
fazer com que o processo que o contém seja considerado em primeiro plano de maneiras
diferentes. Um processo é considerado em primeiro plano se atender a alguma das
seguintes condições:
Só haverá alguns desses processos no sistema, e eles só serão eliminados como um último recurso se a memória estiver tão baixa que nem mesmo esses processos
possam continuar em execução. Geralmente, se isso acontecer, o dispositivo
terá alcançado um estado de paginação de memória. Portanto, essa ação é necessária para manter a interface
do usuário responsiva.
- Um processo visível está realizando uma tarefa da qual o usuário está ciente.
Por isso, encerrá-lo causa um impacto negativo significativo na experiência do usuário. Um processo é
considerado visível nas seguintes condições:
- Ele está executando um
Activity
visível para o usuário na tela, mas não em primeiro plano. O método
onPause()
foi chamado. Isso pode
ocorrer, por exemplo, se a Activity
em primeiro plano for exibida como uma caixa de diálogo
que permite que a Activity
anterior seja vista por trás dela.
- Ele tem um
Service
em execução como um serviço em primeiro plano,
por meio de Service.startForeground()
, que
pede ao sistema para tratar o serviço como algo que o usuário conhece ou, essencialmente,
como se estivesse visível.
- Ele hospeda um serviço que o sistema está usando para um recurso específico do qual o usuário está ciente, como um plano de fundo interativo ou um serviço de método de entrada.
O número desses processos em execução no sistema é menos limitado que os processos em primeiro
plano, mas ainda relativamente controlado. Esses processos são
considerados extremamente importantes e não são eliminados, a menos que isso seja
necessário para manter todos os processos em primeiro plano em execução.
- Um processo de serviço é aquele que contém um
Service
que foi iniciado com o
método startService()
. Embora esses
processos não sejam diretamente visíveis para o usuário, eles geralmente fazem coisas
que são importantes para o usuário (como upload ou download
de dados de rede em segundo plano). Portanto, o sistema sempre mantém esses processos
em execução, a menos que não haja memória suficiente para reter todos os processos em primeiro plano e visíveis.
Os serviços que estão em execução há muito tempo, como 30 minutos ou mais, podem ter a importância rebaixada para permitir que o processo seja enviado para a lista de LRUs em cache.
Os processos que precisam ser executados por um longo período podem ser criados com
setForeground
.
Se for um processo periódico que exige um tempo de execução rígido, ele poderá ser
programado pelo AlarmManager
.
Para mais informações, consulte Suporte para workers de longa duração.
Isso ajuda a evitar situações em que serviços de longa duração que usam recursos excessivos, por
exemplo, com vazamento de memória, impedem que o sistema ofereça uma boa experiência do usuário.
- Um processo armazenado em cache é um que não é necessário no momento. Portanto, o
sistema está livre para eliminá-lo conforme necessário quando recursos como memória forem necessários em outro lugar. Em um sistema com comportamento
normal, esses são os únicos processos envolvidos no gerenciamento de recursos.
Um sistema bem executado tem vários processos em cache sempre disponíveis, para alternar entre apps de modo eficiente, e elimina com frequência os mais antigos, conforme necessário.
Somente em situações muito críticas, o sistema chega a um ponto em que
todos os processos em cache são eliminados e ele precisa começar a eliminar processos de serviço.
Como os processos em cache podem ser encerrados pelo sistema a qualquer momento, os apps precisam interromper todo o trabalho
enquanto estiverem no estado de cache. Se o app precisar realizar um trabalho crítico para o usuário,
ele precisará usar uma das APIs acima para executar o trabalho em um estado de processo ativo.
Os processos em cache geralmente contêm uma ou mais instâncias Activity
que não estão visíveis no momento para o usuário. O
método onStop()
foi chamado e retornado.
Contanto que o ciclo de vida Activity
seja implementado corretamente quando o sistema
encerrar esses processos, ele não vai afetar a experiência do usuário ao retornar ao app.
Ele pode restaurar o estado salvo anteriormente quando a atividade associada é recriada em
um novo processo. Não há garantia de que onDestroy()
será chamado no caso de um processo ser encerrado pelo sistema.
Para mais detalhes, consulte Activity
.
A partir do Android 13, um processo de app pode receber tempo de execução limitado ou nenhum até entrar
em um dos estados ativos do ciclo de vida acima.
Os processos em cache são mantidos em uma lista. A política de ordenação exata para essa lista
é um detalhe de implementação da plataforma. Geralmente, ele tenta manter processos mais
úteis, como aqueles que hospedam o app de início do usuário ou a última atividade que ele acessou,
antes de outros tipos de processos. Outras políticas para eliminar processos também podem
ser aplicadas, como definir limites rígidos no número de processos permitidos ou limitar o tempo
que um processo pode permanecer continuamente armazenado em cache.
Ao decidir como classificar um processo, o sistema baseia a decisão no nível mais
importante encontrado entre todos os componentes ativos no processo.
Consulte a documentação Activity
, Service
e
BroadcastReceiver
para mais detalhes sobre como
cada um desses componentes contribui para o ciclo de vida geral de um processo e
do aplicativo.
A prioridade de um processo também pode ser aumentada com base em outras dependências
de um outro processo a ele. Por exemplo, se o processo A estiver vinculado a um
Service
com
a flag Context.BIND_AUTO_CREATE
ou estiver usando um
ContentProvider
no processo B, a classificação do processo B
será sempre pelo menos tão importante quanto a do processo A.
O conteúdo e os exemplos de código nesta página estão sujeitos às licenças descritas na Licença de conteúdo. Java e OpenJDK são marcas registradas da Oracle e/ou suas afiliadas.
Última atualização 2025-07-27 UTC.
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Não contém as informações de que eu preciso","missingTheInformationINeed","thumb-down"],["Muito complicado / etapas demais","tooComplicatedTooManySteps","thumb-down"],["Desatualizado","outOfDate","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Problema com as amostras / o código","samplesCodeIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 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."]]