page.title=Processes and Threads
page.tags="lifecycle","background"

@jd:body

<div id="qv-wrapper">
<div id="qv">
<h2>Quickview</h2>
<ul>
  <li>Every application runs in its own process and all components of the application run in that
process, by default</li>
  <li>Any slow, blocking operations in an activity should be done in a new thread, to avoid slowing
down the user interface</li>
</ul>

<h2>In this document</h2>
<ol>
<li><a href="#Processes">Processes</a>
  <ol>
    <li><a href="#Lifecycle">Process lifecycle</a></li>
  </ol>
</li>
<li><a href="#Threads">Threads</a>
  <ol>
    <li><a href="#WorkerThreads">Worker threads</a></li>
    <li><a href="#ThreadSafe">Thread-safe methods</a></li>
  </ol>
</li>
<li><a href="#IPC">Interprocess Communication</a></li>
</ol>

</div>
</div>

<p>When an application component starts and the application does not have any other components
running, the Android system starts a new Linux process for the application with a single thread of
execution. By default, all components of the same application run in the same process and thread
(called the "main" thread). If an application component starts and there already exists a process
for that application (because another component from the application exists), then the component is
started within that process and uses the same thread of execution. However, you can arrange for
different components in your application to run in separate processes, and you can create additional
threads for any process.</p>

<p>This document discusses how processes and threads work in an Android application.</p>


<h2 id="Processes">Processes</h2>

<p>By default, all components of the same application run in the same process and most applications
should not change this. However, if you find that you need to control which process a certain
component belongs to, you can do so in the manifest file.</p>

<p>The manifest entry for each type of component element&mdash;<a
href="{@docRoot}guide/topics/manifest/activity-element.html">{@code
&lt;activity&gt;}</a>, <a href="{@docRoot}guide/topics/manifest/service-element.html">{@code
&lt;service&gt;}</a>, <a href="{@docRoot}guide/topics/manifest/receiver-element.html">{@code
&lt;receiver&gt;}</a>, and <a href="{@docRoot}guide/topics/manifest/provider-element.html">{@code
&lt;provider&gt;}</a>&mdash;supports an {@code android:process} attribute that can specify a
process in which that component should run. You can set this attribute so that each component runs
in its own process or so that some components share a process while others do not.  You can also set
{@code android:process} so that components of different applications run in the same
process&mdash;provided that the applications share the same Linux user ID and are signed with the
same certificates.</p>

<p>The <a href="{@docRoot}guide/topics/manifest/application-element.html">{@code
&lt;application&gt;}</a> element also supports an {@code android:process} attribute, to set a
default value that applies to all components.</p>

<p>Android might decide to shut down a process at some point, when memory is low and required by
other processes that are more immediately serving the user. Application
components running in the process that's killed are consequently destroyed.  A process is started
again for those components when there's again work for them to do.</p>

<p>When deciding which processes to kill, the Android system weighs their relative importance to
the user.  For example, it more readily shuts down a process hosting activities that are no longer
visible on screen, compared to a process hosting visible activities. The decision whether to
terminate a process, therefore, depends on the state of the components running in that process. The
rules used to decide which processes to terminate is discussed below. </p>


<h3 id="Lifecycle">Process lifecycle</h3>

<p>The Android system tries to maintain an application process for as long as possible, but
eventually needs to remove old processes to reclaim memory for new or more important processes.  To
determine which processes to keep
and which to kill, the system places each process into an "importance hierarchy" based on the
components running in the process and the state of those components.  Processes with the lowest
importance are eliminated first, then those with the next lowest importance, and so on, as necessary
to recover system resources.</p>

<p>There are five levels in the importance hierarchy. The following list presents the different
types of processes in order of importance (the first process is <em>most important</em> and is
<em>killed last</em>):</p>

<ol>
  <li><b>Foreground process</b>
    <p>A process that is required for what the user is currently doing.  A
      process is considered to be in the foreground if any of the following conditions are true:</p>

      <ul>
        <li>It hosts an {@link android.app.Activity} that the user is interacting with (the {@link
android.app.Activity}'s {@link android.app.Activity#onResume onResume()} method has been
called).</li>

        <li>It hosts a {@link android.app.Service} that's bound to the activity that the user is
interacting with.</li>

        <li>It hosts a {@link android.app.Service} that's running "in the foreground"&mdash;the
service has called {@link android.app.Service#startForeground startForeground()}.

        <li>It hosts a {@link android.app.Service} that's executing one of its lifecycle
callbacks ({@link android.app.Service#onCreate onCreate()}, {@link android.app.Service#onStart
onStart()}, or {@link android.app.Service#onDestroy onDestroy()}).</li>

        <li>It hosts a {@link android.content.BroadcastReceiver} that's executing its {@link
        android.content.BroadcastReceiver#onReceive onReceive()} method.</li>
    </ul>

    <p>Generally, only a few foreground processes exist at any given time.  They are killed only as
a last resort&mdash;if memory is so low that they cannot all continue to run.  Generally, at that
point, the device has reached a memory paging state, so killing some foreground processes is
required to keep the user interface responsive.</p></li>

  <li><b>Visible process</b>
    <p>A process that doesn't have any foreground components, but still can
      affect what the user sees on screen. A process is considered to be visible if either of the
      following conditions are true:</p>

      <ul>
        <li>It hosts an {@link android.app.Activity} that is not in the foreground, but is still
visible to the user (its {@link android.app.Activity#onPause onPause()} method has been called). 
This might occur, for example, if the foreground activity started a dialog, which allows the
previous activity to be seen behind it.</li>

        <li>It hosts a {@link android.app.Service} that's bound to a visible (or foreground)
activity.</li>
      </ul>

      <p>A visible process is considered extremely important and will not be killed unless doing so
is required to keep all foreground processes running. </p>
    </li>

  <li><b>Service process</b>
    <p>A process that is running a service that has been started with the {@link
android.content.Context#startService startService()} method and does not fall into either of the two
higher categories. Although service processes are not directly tied to anything the user sees, they
are generally doing things that the user cares about (such as playing music in the background or
downloading  data on the network), so the system keeps them running unless there's not enough memory
to retain them along with all foreground and visible processes. </p>
  </li>

  <li><b>Background process</b>
    <p>A process holding an activity that's not currently visible to the user  (the activity's
{@link android.app.Activity#onStop onStop()} method has been called). These processes have no direct
impact on the user experience, and the system can kill them at any time to reclaim memory for a
foreground,
visible, or service process. Usually there are many background processes running, so they are kept
in an LRU (least recently used) list to ensure that the process with the activity that was most
recently seen by the user is the last to be killed. If an activity implements its lifecycle methods
correctly, and saves its current state, killing its process will not have a visible effect on
the user experience, because when the user navigates back to the activity, the activity restores
all of its visible state. See the <a
href="{@docRoot}guide/components/activities.html#SavingActivityState">Activities</a>
document for information about saving and restoring state.</p>
  </li>

  <li><b>Empty process</b>
    <p>A process that doesn't hold any active application components.  The only reason to keep this
kind of process alive is for caching purposes, to improve startup time the next time a component
needs to run in it.  The system often kills these processes in order to balance overall system
resources between process caches and the underlying kernel caches.</p>
  </li>
</ol>


  <p>Android ranks a process at the highest level it can, based upon the importance of the
components currently active in the process.  For example, if a process hosts a service and a visible
activity, the process is ranked as a visible process, not a service process.</p>

  <p>In addition, a process's ranking might be increased because other processes are dependent on
it&mdash;a process that is serving another process can never be ranked lower than the process it is
serving. For example, if a content provider in process A is serving a client in process B, or if a
service in process A is bound to a component in process B, process A is always considered at least
as important as process B.</p>

  <p>Because a process running a service is ranked higher than a process with background activities,
an activity that initiates a long-running operation might do well to start a <a
href="{@docRoot}guide/components/services.html">service</a> for that operation, rather than
simply create a worker thread&mdash;particularly if the operation will likely outlast the activity.
For example, an activity that's uploading a picture to a web site should start a service to perform
the upload so that the upload can continue in the background even if the user leaves the activity.
Using a service guarantees that the operation will have at least "service process" priority,
regardless of what happens to the activity. This is the same reason that broadcast receivers should
employ services rather than simply put time-consuming operations in a thread.</p>




<h2 id="Threads">Threads</h2>

<p>When an application is launched, the system creates a thread of execution for the application,
called "main." This thread is very important because it is in charge of dispatching events to
the appropriate user interface widgets, including drawing events. It is also the thread in which
your application interacts with components from the Android UI toolkit (components from the {@link
android.widget} and {@link android.view} packages). As such, the main thread is also sometimes
called the UI thread.</p>

<p>The system does <em>not</em> create a separate thread for each instance of a component. All
components that run in the same process are instantiated in the UI thread, and system calls to
each component are dispatched from that thread. Consequently, methods that respond to system
callbacks (such as {@link android.view.View#onKeyDown onKeyDown()} to report user actions
or a lifecycle callback method) always run in the UI thread of the process.</p>

<p>For instance, when the user touches a button on the screen, your app's UI thread dispatches the
touch event to the widget, which in turn sets its pressed state and posts an invalidate request to
the event queue. The UI thread dequeues the request and notifies the widget that it should redraw
itself.</p>

<p>When your app performs intensive work in response to user interaction, this single thread model
can yield poor performance unless you implement your application properly. Specifically, if
everything is happening in the UI thread, performing long operations such as network access or
database queries will block the whole UI. When the thread is blocked, no events can be dispatched,
including drawing events. From the user's perspective, the
application appears to hang. Even worse, if the UI thread is blocked for more than a few seconds
(about 5 seconds currently) the user is presented with the infamous "<a
href="http://developer.android.com/guide/practices/responsiveness.html">application not
responding</a>" (ANR) dialog. The user might then decide to quit your application and uninstall it
if they are unhappy.</p>

<p>Additionally, the Andoid UI toolkit is <em>not</em> thread-safe. So, you must not manipulate
your UI from a worker thread&mdash;you must do all manipulation to your user interface from the UI
thread. Thus, there are simply two rules to Android's single thread model:</p>

<ol>
<li>Do not block the UI thread
<li>Do not access the Android UI toolkit from outside the UI thread
</ol>

<h3 id="WorkerThreads">Worker threads</h3>

<p>Because of the single thread model described above, it's vital to the responsiveness of your
application's UI that you do not block the UI thread. If you have operations to perform
that are not instantaneous, you should make sure to do them in separate threads ("background" or
"worker" threads).</p>

<p>For example, below is some code for a click listener that downloads an image from a separate
thread and displays it in an {@link android.widget.ImageView}:</p>

<pre>
public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            Bitmap b = loadImageFromNetwork("http://example.com/image.png");
            mImageView.setImageBitmap(b);
        }
    }).start();
}
</pre>

<p>At first, this seems to work fine, because it creates a new thread to handle the network
operation. However, it violates the second rule of the single-threaded model: <em>do not access the
Android UI toolkit from outside the UI thread</em>&mdash;this sample modifies the {@link
android.widget.ImageView} from the worker thread instead of the UI thread. This can result in
undefined and unexpected behavior, which can be difficult and time-consuming to track down.</p>

<p>To fix this problem, Android offers several ways to access the UI thread from other
threads. Here is a list of methods that can help:</p>

<ul>
<li>{@link android.app.Activity#runOnUiThread(java.lang.Runnable)
Activity.runOnUiThread(Runnable)}</li>
<li>{@link android.view.View#post(java.lang.Runnable) View.post(Runnable)}</li>
<li>{@link android.view.View#postDelayed(java.lang.Runnable, long) View.postDelayed(Runnable,
long)}</li>
</ul>

<p>For example, you can fix the above code by using the {@link
android.view.View#post(java.lang.Runnable) View.post(Runnable)} method:</p>

<pre>
public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            final Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png");
            mImageView.post(new Runnable() {
                public void run() {
                    mImageView.setImageBitmap(bitmap);
                }
            });
        }
    }).start();
}
</pre>

<p>Now this implementation is thread-safe: the network operation is done from a separate thread
while the {@link android.widget.ImageView} is manipulated from the UI thread.</p>

<p>However, as the complexity of the operation grows, this kind of code can get complicated and
difficult to maintain. To handle more complex interactions with a worker thread, you might consider
using a {@link android.os.Handler} in your worker thread, to process messages delivered from the UI
thread. Perhaps the best solution, though, is to extend the {@link android.os.AsyncTask} class,
which simplifies the execution of worker thread tasks that need to interact with the UI.</p>


<h4 id="AsyncTask">Using AsyncTask</h4>

<p>{@link android.os.AsyncTask} allows you to perform asynchronous work on your user
interface. It performs the blocking operations in a worker thread and then publishes the results on
the UI thread, without requiring you to handle threads and/or handlers yourself.</p>

<p>To use it, you must subclass {@link android.os.AsyncTask} and implement the {@link
android.os.AsyncTask#doInBackground doInBackground()} callback method, which runs in a pool of
background threads. To update your UI, you should implement {@link
android.os.AsyncTask#onPostExecute onPostExecute()}, which delivers the result from {@link
android.os.AsyncTask#doInBackground doInBackground()} and runs in the UI thread, so you can safely
update your UI. You can then run the task by calling {@link android.os.AsyncTask#execute execute()}
from the UI thread.</p>

<p>For example, you can implement the previous example using {@link android.os.AsyncTask} this
way:</p>

<pre>
public void onClick(View v) {
    new DownloadImageTask().execute("http://example.com/image.png");
}

private class DownloadImageTask extends AsyncTask&lt;String, Void, Bitmap&gt; {
    /** The system calls this to perform work in a worker thread and
      * delivers it the parameters given to AsyncTask.execute() */
    protected Bitmap doInBackground(String... urls) {
        return loadImageFromNetwork(urls[0]);
    }
    
    /** The system calls this to perform work in the UI thread and delivers
      * the result from doInBackground() */
    protected void onPostExecute(Bitmap result) {
        mImageView.setImageBitmap(result);
    }
}
</pre>

<p>Now the UI is safe and the code is simpler, because it separates the work into the
part that should be done on a worker thread and the part that should be done on the UI thread.</p>

<p>You should read the {@link android.os.AsyncTask} reference for a full understanding on
how to use this class, but here is a quick overview of how it works:</p>

<ul>
<li>You can specify the type of the parameters, the progress values, and the final
value of the task, using generics</li>
<li>The method {@link android.os.AsyncTask#doInBackground doInBackground()} executes automatically
on a worker thread</li>
<li>{@link android.os.AsyncTask#onPreExecute onPreExecute()}, {@link
android.os.AsyncTask#onPostExecute onPostExecute()}, and {@link
android.os.AsyncTask#onProgressUpdate onProgressUpdate()} are all invoked on the UI thread</li>
<li>The value returned by {@link android.os.AsyncTask#doInBackground doInBackground()} is sent to
{@link android.os.AsyncTask#onPostExecute onPostExecute()}</li>
<li>You can call {@link android.os.AsyncTask#publishProgress publishProgress()} at anytime in {@link
android.os.AsyncTask#doInBackground doInBackground()} to execute {@link
android.os.AsyncTask#onProgressUpdate onProgressUpdate()} on the UI thread</li>
<li>You can cancel the task at any time, from any thread</li>
</ul>

<p class="caution"><strong>Caution:</strong> Another problem you might encounter when using a worker
thread is unexpected restarts in your activity due to a <a
href="{@docRoot}guide/topics/resources/runtime-changes.html">runtime configuration change</a>
(such as when the user changes the screen orientation), which may destroy your worker thread. To
see how you can persist your task during one of these restarts and how to properly cancel the task
when the activity is destroyed, see the source code for the <a
href="http://code.google.com/p/shelves/">Shelves</a> sample application.</p>


<h3 id="ThreadSafe">Thread-safe methods</h3>

<p> In some situations, the methods you implement might be called from more than one thread, and
therefore must be written to be thread-safe. </p>

<p>This is primarily true for methods that can be called remotely&mdash;such as methods in a <a
href="{@docRoot}guide/components/bound-services.html">bound service</a>. When a call on a
method implemented in an {@link android.os.IBinder} originates in the same process in which the
{@link android.os.IBinder IBinder} is running, the method is executed in the caller's thread.
However, when the call originates in another process, the method is executed in a thread chosen from
a pool of threads that the system maintains in the same process as the {@link android.os.IBinder
IBinder} (it's not executed in the UI thread of the process).  For example, whereas a service's
{@link android.app.Service#onBind onBind()} method would be called from the UI thread of the
service's process, methods implemented in the object that {@link android.app.Service#onBind
onBind()} returns (for example, a subclass that implements RPC methods) would be called from threads
in the pool. Because a service can have more than one client, more than one pool thread can engage
the same {@link android.os.IBinder IBinder} method at the same time.  {@link android.os.IBinder
IBinder} methods must, therefore, be implemented to be thread-safe.</p>

<p> Similarly, a content provider can receive data requests that originate in other processes.
Although the {@link android.content.ContentResolver} and {@link android.content.ContentProvider}
classes hide the details of how the interprocess communication is managed, {@link
android.content.ContentProvider} methods that respond to those requests&mdash;the methods {@link
android.content.ContentProvider#query query()}, {@link android.content.ContentProvider#insert
insert()}, {@link android.content.ContentProvider#delete delete()}, {@link
android.content.ContentProvider#update update()}, and {@link android.content.ContentProvider#getType
getType()}&mdash;are called from a pool of threads in the content provider's process, not the UI
thread for the process.  Because these methods might be called from any number of threads at the
same time, they too must be implemented to be thread-safe. </p>


<h2 id="IPC">Interprocess Communication</h2>

<p>Android offers a mechanism for interprocess communication (IPC) using remote procedure calls
(RPCs), in which a method is called by an activity or other application component, but executed
remotely (in another process), with any result returned back to the
caller. This entails decomposing a method call and its data to a level the operating system can
understand, transmitting it from the local process and address space to the remote process and
address space, then reassembling and reenacting the call there.  Return values are then
transmitted in the opposite direction.  Android provides all the code to perform these IPC
transactions, so you can focus on defining and implementing the RPC programming interface. </p>

<p>To perform IPC, your application must bind to a service, using {@link
android.content.Context#bindService bindService()}. For more information, see the <a
href="{@docRoot}guide/components/services.html">Services</a> developer guide.</p>


<!--
<h2>Beginner's Path</h2>

<p>For information about how to perform work in the background for an indefinite period of time
(without a user interface), continue with the <b><a
href="{@docRoot}guide/components/services.html">Services</a></b> document.</p>
-->
