diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 19:31:44 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 19:31:44 -0800 |
commit | 9066cfe9886ac131c34d59ed0e2d287b0e3c0087 (patch) | |
tree | d88beb88001f2482911e3d28e43833b50e4b4e97 /docs/html/guide/topics/processes/process-lifecycle.jd | |
parent | d83a98f4ce9cfa908f5c54bbd70f03eec07e7553 (diff) | |
download | frameworks_base-9066cfe9886ac131c34d59ed0e2d287b0e3c0087.zip frameworks_base-9066cfe9886ac131c34d59ed0e2d287b0e3c0087.tar.gz frameworks_base-9066cfe9886ac131c34d59ed0e2d287b0e3c0087.tar.bz2 |
auto import from //depot/cupcake/@135843
Diffstat (limited to 'docs/html/guide/topics/processes/process-lifecycle.jd')
-rw-r--r-- | docs/html/guide/topics/processes/process-lifecycle.jd | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/docs/html/guide/topics/processes/process-lifecycle.jd b/docs/html/guide/topics/processes/process-lifecycle.jd new file mode 100644 index 0000000..0380f94 --- /dev/null +++ b/docs/html/guide/topics/processes/process-lifecycle.jd @@ -0,0 +1,120 @@ +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> |