• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=Processes and Threads
2page.tags=lifecycle,background
3
4@jd:body
5
6<div id="qv-wrapper">
7<div id="qv">
8
9<h2>In this document</h2>
10<ol>
11<li><a href="#Processes">Processes</a>
12  <ol>
13    <li><a href="#Lifecycle">Process lifecycle</a></li>
14  </ol>
15</li>
16<li><a href="#Threads">Threads</a>
17  <ol>
18    <li><a href="#WorkerThreads">Worker threads</a></li>
19    <li><a href="#ThreadSafe">Thread-safe methods</a></li>
20  </ol>
21</li>
22<li><a href="#IPC">Interprocess Communication</a></li>
23</ol>
24
25</div>
26</div>
27
28<p>When an application component starts and the application does not have any other components
29running, the Android system starts a new Linux process for the application with a single thread of
30execution. By default, all components of the same application run in the same process and thread
31(called the "main" thread). If an application component starts and there already exists a process
32for that application (because another component from the application exists), then the component is
33started within that process and uses the same thread of execution. However, you can arrange for
34different components in your application to run in separate processes, and you can create additional
35threads for any process.</p>
36
37<p>This document discusses how processes and threads work in an Android application.</p>
38
39
40<h2 id="Processes">Processes</h2>
41
42<p>By default, all components of the same application run in the same process and most applications
43should not change this. However, if you find that you need to control which process a certain
44component belongs to, you can do so in the manifest file.</p>
45
46<p>The manifest entry for each type of component element&mdash;<a
47href="{@docRoot}guide/topics/manifest/activity-element.html">{@code
48<activity>}</a>, <a href="{@docRoot}guide/topics/manifest/service-element.html">{@code
49<service>}</a>, <a href="{@docRoot}guide/topics/manifest/receiver-element.html">{@code
50<receiver>}</a>, and <a href="{@docRoot}guide/topics/manifest/provider-element.html">{@code
51<provider>}</a>&mdash;supports an {@code android:process} attribute that can specify a
52process in which that component should run. You can set this attribute so that each component runs
53in its own process or so that some components share a process while others do not.  You can also set
54{@code android:process} so that components of different applications run in the same
55process&mdash;provided that the applications share the same Linux user ID and are signed with the
56same certificates.</p>
57
58<p>The <a href="{@docRoot}guide/topics/manifest/application-element.html">{@code
59<application>}</a> element also supports an {@code android:process} attribute, to set a
60default value that applies to all components.</p>
61
62<p>Android might decide to shut down a process at some point, when memory is low and required by
63other processes that are more immediately serving the user. Application
64components running in the process that's killed are consequently destroyed.  A process is started
65again for those components when there's again work for them to do.</p>
66
67<p>When deciding which processes to kill, the Android system weighs their relative importance to
68the user.  For example, it more readily shuts down a process hosting activities that are no longer
69visible on screen, compared to a process hosting visible activities. The decision whether to
70terminate a process, therefore, depends on the state of the components running in that process. The
71rules used to decide which processes to terminate is discussed below. </p>
72
73
74<h3 id="Lifecycle">Process lifecycle</h3>
75
76<p>The Android system tries to maintain an application process for as long as possible, but
77eventually needs to remove old processes to reclaim memory for new or more important processes.  To
78determine which processes to keep
79and which to kill, the system places each process into an "importance hierarchy" based on the
80components running in the process and the state of those components.  Processes with the lowest
81importance are eliminated first, then those with the next lowest importance, and so on, as necessary
82to recover system resources.</p>
83
84<p>There are five levels in the importance hierarchy. The following list presents the different
85types of processes in order of importance (the first process is <em>most important</em> and is
86<em>killed last</em>):</p>
87
88<ol>
89  <li><b>Foreground process</b>
90    <p>A process that is required for what the user is currently doing.  A
91      process is considered to be in the foreground if any of the following conditions are true:</p>
92
93      <ul>
94        <li>It hosts an {@link android.app.Activity} that the user is interacting with (the {@link
95android.app.Activity}'s {@link android.app.Activity#onResume onResume()} method has been
96called).</li>
97
98        <li>It hosts a {@link android.app.Service} that's bound to the activity that the user is
99interacting with.</li>
100
101        <li>It hosts a {@link android.app.Service} that's running "in the foreground"&mdash;the
102service has called {@link android.app.Service#startForeground startForeground()}.
103
104        <li>It hosts a {@link android.app.Service} that's executing one of its lifecycle
105callbacks ({@link android.app.Service#onCreate onCreate()}, {@link android.app.Service#onStart
106onStart()}, or {@link android.app.Service#onDestroy onDestroy()}).</li>
107
108        <li>It hosts a {@link android.content.BroadcastReceiver} that's executing its {@link
109        android.content.BroadcastReceiver#onReceive onReceive()} method.</li>
110    </ul>
111
112    <p>Generally, only a few foreground processes exist at any given time.  They are killed only as
113a last resort&mdash;if memory is so low that they cannot all continue to run.  Generally, at that
114point, the device has reached a memory paging state, so killing some foreground processes is
115required to keep the user interface responsive.</p></li>
116
117  <li><b>Visible process</b>
118    <p>A process that doesn't have any foreground components, but still can
119      affect what the user sees on screen. A process is considered to be visible if either of the
120      following conditions are true:</p>
121
122      <ul>
123        <li>It hosts an {@link android.app.Activity} that is not in the foreground, but is still
124visible to the user (its {@link android.app.Activity#onPause onPause()} method has been called).
125This might occur, for example, if the foreground activity started a dialog, which allows the
126previous activity to be seen behind it.</li>
127
128        <li>It hosts a {@link android.app.Service} that's bound to a visible (or foreground)
129activity.</li>
130      </ul>
131
132      <p>A visible process is considered extremely important and will not be killed unless doing so
133is required to keep all foreground processes running. </p>
134    </li>
135
136  <li><b>Service process</b>
137    <p>A process that is running a service that has been started with the {@link
138android.content.Context#startService startService()} method and does not fall into either of the two
139higher categories. Although service processes are not directly tied to anything the user sees, they
140are generally doing things that the user cares about (such as playing music in the background or
141downloading  data on the network), so the system keeps them running unless there's not enough memory
142to retain them along with all foreground and visible processes. </p>
143  </li>
144
145  <li><b>Background process</b>
146    <p>A process holding an activity that's not currently visible to the user  (the activity's
147{@link android.app.Activity#onStop onStop()} method has been called). These processes have no direct
148impact on the user experience, and the system can kill them at any time to reclaim memory for a
149foreground,
150visible, or service process. Usually there are many background processes running, so they are kept
151in an LRU (least recently used) list to ensure that the process with the activity that was most
152recently seen by the user is the last to be killed. If an activity implements its lifecycle methods
153correctly, and saves its current state, killing its process will not have a visible effect on
154the user experience, because when the user navigates back to the activity, the activity restores
155all of its visible state. See the <a
156href="{@docRoot}guide/components/activities.html#SavingActivityState">Activities</a>
157document for information about saving and restoring state.</p>
158  </li>
159
160  <li><b>Empty process</b>
161    <p>A process that doesn't hold any active application components.  The only reason to keep this
162kind of process alive is for caching purposes, to improve startup time the next time a component
163needs to run in it.  The system often kills these processes in order to balance overall system
164resources between process caches and the underlying kernel caches.</p>
165  </li>
166</ol>
167
168
169  <p>Android ranks a process at the highest level it can, based upon the importance of the
170components currently active in the process.  For example, if a process hosts a service and a visible
171activity, the process is ranked as a visible process, not a service process.</p>
172
173  <p>In addition, a process's ranking might be increased because other processes are dependent on
174it&mdash;a process that is serving another process can never be ranked lower than the process it is
175serving. For example, if a content provider in process A is serving a client in process B, or if a
176service in process A is bound to a component in process B, process A is always considered at least
177as important as process B.</p>
178
179  <p>Because a process running a service is ranked higher than a process with background activities,
180an activity that initiates a long-running operation might do well to start a <a
181href="{@docRoot}guide/components/services.html">service</a> for that operation, rather than
182simply create a worker thread&mdash;particularly if the operation will likely outlast the activity.
183For example, an activity that's uploading a picture to a web site should start a service to perform
184the upload so that the upload can continue in the background even if the user leaves the activity.
185Using a service guarantees that the operation will have at least "service process" priority,
186regardless of what happens to the activity. This is the same reason that broadcast receivers should
187employ services rather than simply put time-consuming operations in a thread.</p>
188
189
190
191
192<h2 id="Threads">Threads</h2>
193
194<p>When an application is launched, the system creates a thread of execution for the application,
195called "main." This thread is very important because it is in charge of dispatching events to
196the appropriate user interface widgets, including drawing events. It is also the thread in which
197your application interacts with components from the Android UI toolkit (components from the {@link
198android.widget} and {@link android.view} packages). As such, the main thread is also sometimes
199called the UI thread.</p>
200
201<p>The system does <em>not</em> create a separate thread for each instance of a component. All
202components that run in the same process are instantiated in the UI thread, and system calls to
203each component are dispatched from that thread. Consequently, methods that respond to system
204callbacks (such as {@link android.view.View#onKeyDown onKeyDown()} to report user actions
205or a lifecycle callback method) always run in the UI thread of the process.</p>
206
207<p>For instance, when the user touches a button on the screen, your app's UI thread dispatches the
208touch event to the widget, which in turn sets its pressed state and posts an invalidate request to
209the event queue. The UI thread dequeues the request and notifies the widget that it should redraw
210itself.</p>
211
212<p>When your app performs intensive work in response to user interaction, this single thread model
213can yield poor performance unless you implement your application properly. Specifically, if
214everything is happening in the UI thread, performing long operations such as network access or
215database queries will block the whole UI. When the thread is blocked, no events can be dispatched,
216including drawing events. From the user's perspective, the
217application appears to hang. Even worse, if the UI thread is blocked for more than a few seconds
218(about 5 seconds currently) the user is presented with the infamous "<a
219href="http://developer.android.com/guide/practices/responsiveness.html">application not
220responding</a>" (ANR) dialog. The user might then decide to quit your application and uninstall it
221if they are unhappy.</p>
222
223<p>Additionally, the Andoid UI toolkit is <em>not</em> thread-safe. So, you must not manipulate
224your UI from a worker thread&mdash;you must do all manipulation to your user interface from the UI
225thread. Thus, there are simply two rules to Android's single thread model:</p>
226
227<ol>
228<li>Do not block the UI thread
229<li>Do not access the Android UI toolkit from outside the UI thread
230</ol>
231
232<h3 id="WorkerThreads">Worker threads</h3>
233
234<p>Because of the single thread model described above, it's vital to the responsiveness of your
235application's UI that you do not block the UI thread. If you have operations to perform
236that are not instantaneous, you should make sure to do them in separate threads ("background" or
237"worker" threads).</p>
238
239<p>For example, below is some code for a click listener that downloads an image from a separate
240thread and displays it in an {@link android.widget.ImageView}:</p>
241
242<pre>
243public void onClick(View v) {
244    new Thread(new Runnable() {
245        public void run() {
246            Bitmap b = loadImageFromNetwork("http://example.com/image.png");
247            mImageView.setImageBitmap(b);
248        }
249    }).start();
250}
251</pre>
252
253<p>At first, this seems to work fine, because it creates a new thread to handle the network
254operation. However, it violates the second rule of the single-threaded model: <em>do not access the
255Android UI toolkit from outside the UI thread</em>&mdash;this sample modifies the {@link
256android.widget.ImageView} from the worker thread instead of the UI thread. This can result in
257undefined and unexpected behavior, which can be difficult and time-consuming to track down.</p>
258
259<p>To fix this problem, Android offers several ways to access the UI thread from other
260threads. Here is a list of methods that can help:</p>
261
262<ul>
263<li>{@link android.app.Activity#runOnUiThread(java.lang.Runnable)
264Activity.runOnUiThread(Runnable)}</li>
265<li>{@link android.view.View#post(java.lang.Runnable) View.post(Runnable)}</li>
266<li>{@link android.view.View#postDelayed(java.lang.Runnable, long) View.postDelayed(Runnable,
267long)}</li>
268</ul>
269
270<p>For example, you can fix the above code by using the {@link
271android.view.View#post(java.lang.Runnable) View.post(Runnable)} method:</p>
272
273<pre>
274public void onClick(View v) {
275    new Thread(new Runnable() {
276        public void run() {
277            final Bitmap bitmap =
278                    loadImageFromNetwork("http://example.com/image.png");
279            mImageView.post(new Runnable() {
280                public void run() {
281                    mImageView.setImageBitmap(bitmap);
282                }
283            });
284        }
285    }).start();
286}
287</pre>
288
289<p>Now this implementation is thread-safe: the network operation is done from a separate thread
290while the {@link android.widget.ImageView} is manipulated from the UI thread.</p>
291
292<p>However, as the complexity of the operation grows, this kind of code can get complicated and
293difficult to maintain. To handle more complex interactions with a worker thread, you might consider
294using a {@link android.os.Handler} in your worker thread, to process messages delivered from the UI
295thread. Perhaps the best solution, though, is to extend the {@link android.os.AsyncTask} class,
296which simplifies the execution of worker thread tasks that need to interact with the UI.</p>
297
298
299<h4 id="AsyncTask">Using AsyncTask</h4>
300
301<p>{@link android.os.AsyncTask} allows you to perform asynchronous work on your user
302interface. It performs the blocking operations in a worker thread and then publishes the results on
303the UI thread, without requiring you to handle threads and/or handlers yourself.</p>
304
305<p>To use it, you must subclass {@link android.os.AsyncTask} and implement the {@link
306android.os.AsyncTask#doInBackground doInBackground()} callback method, which runs in a pool of
307background threads. To update your UI, you should implement {@link
308android.os.AsyncTask#onPostExecute onPostExecute()}, which delivers the result from {@link
309android.os.AsyncTask#doInBackground doInBackground()} and runs in the UI thread, so you can safely
310update your UI. You can then run the task by calling {@link android.os.AsyncTask#execute execute()}
311from the UI thread.</p>
312
313<p>For example, you can implement the previous example using {@link android.os.AsyncTask} this
314way:</p>
315
316<pre>
317public void onClick(View v) {
318    new DownloadImageTask().execute("http://example.com/image.png");
319}
320
321private class DownloadImageTask extends AsyncTask&lt;String, Void, Bitmap&gt; {
322    /** The system calls this to perform work in a worker thread and
323      * delivers it the parameters given to AsyncTask.execute() */
324    protected Bitmap doInBackground(String... urls) {
325        return loadImageFromNetwork(urls[0]);
326    }
327
328    /** The system calls this to perform work in the UI thread and delivers
329      * the result from doInBackground() */
330    protected void onPostExecute(Bitmap result) {
331        mImageView.setImageBitmap(result);
332    }
333}
334</pre>
335
336<p>Now the UI is safe and the code is simpler, because it separates the work into the
337part that should be done on a worker thread and the part that should be done on the UI thread.</p>
338
339<p>You should read the {@link android.os.AsyncTask} reference for a full understanding on
340how to use this class, but here is a quick overview of how it works:</p>
341
342<ul>
343<li>You can specify the type of the parameters, the progress values, and the final
344value of the task, using generics</li>
345<li>The method {@link android.os.AsyncTask#doInBackground doInBackground()} executes automatically
346on a worker thread</li>
347<li>{@link android.os.AsyncTask#onPreExecute onPreExecute()}, {@link
348android.os.AsyncTask#onPostExecute onPostExecute()}, and {@link
349android.os.AsyncTask#onProgressUpdate onProgressUpdate()} are all invoked on the UI thread</li>
350<li>The value returned by {@link android.os.AsyncTask#doInBackground doInBackground()} is sent to
351{@link android.os.AsyncTask#onPostExecute onPostExecute()}</li>
352<li>You can call {@link android.os.AsyncTask#publishProgress publishProgress()} at anytime in {@link
353android.os.AsyncTask#doInBackground doInBackground()} to execute {@link
354android.os.AsyncTask#onProgressUpdate onProgressUpdate()} on the UI thread</li>
355<li>You can cancel the task at any time, from any thread</li>
356</ul>
357
358<p class="caution"><strong>Caution:</strong> Another problem you might encounter when using a worker
359thread is unexpected restarts in your activity due to a <a
360href="{@docRoot}guide/topics/resources/runtime-changes.html">runtime configuration change</a>
361(such as when the user changes the screen orientation), which may destroy your worker thread. To
362see how you can persist your task during one of these restarts and how to properly cancel the task
363when the activity is destroyed, see the source code for the <a
364href="http://code.google.com/p/shelves/">Shelves</a> sample application.</p>
365
366
367<h3 id="ThreadSafe">Thread-safe methods</h3>
368
369<p> In some situations, the methods you implement might be called from more than one thread, and
370therefore must be written to be thread-safe. </p>
371
372<p>This is primarily true for methods that can be called remotely&mdash;such as methods in a <a
373href="{@docRoot}guide/components/bound-services.html">bound service</a>. When a call on a
374method implemented in an {@link android.os.IBinder} originates in the same process in which the
375{@link android.os.IBinder IBinder} is running, the method is executed in the caller's thread.
376However, when the call originates in another process, the method is executed in a thread chosen from
377a pool of threads that the system maintains in the same process as the {@link android.os.IBinder
378IBinder} (it's not executed in the UI thread of the process).  For example, whereas a service's
379{@link android.app.Service#onBind onBind()} method would be called from the UI thread of the
380service's process, methods implemented in the object that {@link android.app.Service#onBind
381onBind()} returns (for example, a subclass that implements RPC methods) would be called from threads
382in the pool. Because a service can have more than one client, more than one pool thread can engage
383the same {@link android.os.IBinder IBinder} method at the same time.  {@link android.os.IBinder
384IBinder} methods must, therefore, be implemented to be thread-safe.</p>
385
386<p> Similarly, a content provider can receive data requests that originate in other processes.
387Although the {@link android.content.ContentResolver} and {@link android.content.ContentProvider}
388classes hide the details of how the interprocess communication is managed, {@link
389android.content.ContentProvider} methods that respond to those requests&mdash;the methods {@link
390android.content.ContentProvider#query query()}, {@link android.content.ContentProvider#insert
391insert()}, {@link android.content.ContentProvider#delete delete()}, {@link
392android.content.ContentProvider#update update()}, and {@link android.content.ContentProvider#getType
393getType()}&mdash;are called from a pool of threads in the content provider's process, not the UI
394thread for the process.  Because these methods might be called from any number of threads at the
395same time, they too must be implemented to be thread-safe. </p>
396
397
398<h2 id="IPC">Interprocess Communication</h2>
399
400<p>Android offers a mechanism for interprocess communication (IPC) using remote procedure calls
401(RPCs), in which a method is called by an activity or other application component, but executed
402remotely (in another process), with any result returned back to the
403caller. This entails decomposing a method call and its data to a level the operating system can
404understand, transmitting it from the local process and address space to the remote process and
405address space, then reassembling and reenacting the call there.  Return values are then
406transmitted in the opposite direction.  Android provides all the code to perform these IPC
407transactions, so you can focus on defining and implementing the RPC programming interface. </p>
408
409<p>To perform IPC, your application must bind to a service, using {@link
410android.content.Context#bindService bindService()}. For more information, see the <a
411href="{@docRoot}guide/components/services.html">Services</a> developer guide.</p>
412
413
414<!--
415<h2>Beginner's Path</h2>
416
417<p>For information about how to perform work in the background for an indefinite period of time
418(without a user interface), continue with the <b><a
419href="{@docRoot}guide/components/services.html">Services</a></b> document.</p>
420-->
421