| page.title=Processes and Application Life Cycle | |
| @jd:body | |
| <p>In most cases, every Android application runs in its own Linux process. | |
| This process is created for the application when some of its code needs to | |
| be run, and will remain running until it is no longer needed <em>and</em> | |
| the system needs to reclaim its memory for use by other applications.</p> | |
| <p>An unusual and fundamental feature of Android is that an application process's | |
| lifetime is <em>not</em> directly controlled by the application itself. | |
| Instead, it is determined by the system through a combination of the parts of the application | |
| that the system knows are running, how important these things are to the user, | |
| and how much overall memory is available in the system.</p> | |
| <p>It is important that | |
| application developers understand how different application components | |
| (in particular {@link android.app.Activity}, {@link android.app.Service}, | |
| and {@link android.content.BroadcastReceiver}) impact the lifetime | |
| of the application's process. <strong>Not using these components correctly can | |
| result in the system killing the application's process while it is doing | |
| important work.</strong></p> | |
| <p>A common example of a process life-cycle bug is a | |
| {@link android.content.BroadcastReceiver} that starts a thread when it | |
| receives an Intent in its {@link android.content.BroadcastReceiver#onReceive | |
| BroadcastReceiver.onReceive()} | |
| method, and then returns from the function. Once it returns, the system | |
| considers the BroadcastReceiver to be no longer active, and thus, its hosting | |
| process no longer needed (unless other application components are active in | |
| it). So, the system may kill the process at any time to reclaim memory, and in doing so, | |
| it terminates the spawned thread running in the process. The solution to this problem | |
| is to start a {@link android.app.Service} from the BroadcastReceiver, so the | |
| system knows that there is still active work being done in the process.</p> | |
| <p>To determine which processes should be killed when low on memory, Android | |
| places each process into an "importance hierarchy" based on the components running in | |
| them and the state of those components. These process types are (in order of importance):</p> | |
| <ol> | |
| <li>A <strong>foreground process</strong> 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: | |
| <ul> | |
| <li> It is running an {@link android.app.Activity} | |
| at the top of the screen that the user is interacting with (its | |
| {@link android.app.Activity#onResume} method has been called).</li> | |
| <li> It has a {@link android.content.BroadcastReceiver} that is currently running | |
| (its {@link android.content.BroadcastReceiver#onReceive | |
| BroadcastReceiver.onReceive()} method is executing).</li> | |
| <li>It has a {@link android.app.Service} that is currently executing code | |
| in one of its callbacks ({@link android.app.Service#onCreate Service.onCreate()}, | |
| {@link android.app.Service#onStart Service.onStart()}, or | |
| {@link android.app.Service#onDestroy Service.onDestroy()}).</li> | |
| </ul> | |
| </li> | |
| <p>There will only ever be a few such processes in the system, and these will only | |
| be killed as a last resort if memory is so low that not even these processes | |
| can continue to run. Generally, at this point, the device has | |
| reached a memory paging state, so this action is required in order to keep the user | |
| interface responsive.</p> | |
| </li> | |
| <li>A <strong>visible process</strong> is one holding an {@link android.app.Activity} | |
| that is visible to the user on-screen but not in the foreground (its | |
| {@link android.app.Activity#onPause} method has been called). This may | |
| occur, for example, if the foreground Activity is displayed as a dialog | |
| that allows the previous Activity to be seen behind it. Such a | |
| process is considered extremely important and will not be killed unless doing so is | |
| required to keep all foreground processes running. | |
| </li> | |
| <li>A <strong>service process</strong> is one holding a {@link android.app.Service} | |
| that has been started with the | |
| {@link android.content.Context#startService startService()} method. Though these | |
| processes are not directly visible to the user, they are generally doing things | |
| that the user cares about (such as background mp3 playback or background | |
| network data upload or download), so the system will always keep such processes | |
| running unless there is not enough memory to retain all foreground and visible process. | |
| </li> | |
| <li>A <strong>background process</strong> is one holding an {@link android.app.Activity} | |
| that is not currently visible to the user (its | |
| {@link android.app.Activity#onStop} method has been called). These processes | |
| have no direct impact on the user experience. Provided they implement | |
| their Activity life-cycle correctly | |
| (see {@link android.app.Activity} for more details), the system | |
| can kill such processes at any time to reclaim memory for one of the three | |
| previous processes types. Usually there are many of these processes running, | |
| so they are kept in an LRU list to ensure the process that was most recently seen | |
| by the user is the last to be killed when running low on memory. | |
| </li> | |
| <li>An <strong>empty process</strong> is one that doesn't hold any active application | |
| components. The only reason to keep such a process around is as a cache to | |
| improve startup time the next time a component of its application needs to | |
| run. As such, the system will often kill these processes in order to | |
| balance overall system resources between these empty cached processes and the | |
| underlying kernel caches. | |
| </li> | |
| </ol> | |
| <p>When deciding how to classify a process, the system will base its decision on the most | |
| important level found among all the components currently active in the process. | |
| See the {@link android.app.Activity}, {@link android.app.Service}, and | |
| {@link android.content.BroadcastReceiver} documentation for more detail on how | |
| each of these components contribute to the overall life-cycle of a process. | |
| The documentation for each of these classes describes in more detail how | |
| they impact the overall life-cycle of their application.</p> | |
| <p>A process's priority may also be increased based on other dependencies | |
| a process has to it. For example, if process A has bound to a | |
| {@link android.app.Service} with | |
| the {@link android.content.Context#BIND_AUTO_CREATE Context.BIND_AUTO_CREATE} | |
| flag or is using a | |
| {@link android.content.ContentProvider} in process B, then process B's | |
| classification will always be at least as important as process A's.</p> |