19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpage.title=Processes and Application Life Cycle
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@jd:body
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>In most cases, every Android application runs in its own Linux process.
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectThis process is created for the application when some of its code needs to
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbe run, and will remain running until it is no longer needed <em>and</em>
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthe system needs to reclaim its memory for use by other applications.</p>
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>An unusual and fundamental feature of Android is that an application process's
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectlifetime is <em>not</em> directly controlled by the application itself.
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectInstead, it is determined by the system through a combination of the parts of the application
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthat the system knows are running, how important these things are to the user,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectand how much overall memory is available in the system.</p>
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>It is important that
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectapplication developers understand how different application components
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project(in particular {@link android.app.Activity}, {@link android.app.Service},
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectand {@link android.content.BroadcastReceiver}) impact the lifetime
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectof the application's process.  <strong>Not using these components correctly can
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectresult in the system killing the application's process while it is doing
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimportant work.</strong></p>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>A common example of a process life-cycle bug is a
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.content.BroadcastReceiver} that starts a thread when it
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectreceives an Intent in its {@link android.content.BroadcastReceiver#onReceive
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectBroadcastReceiver.onReceive()}
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmethod, and then returns from the function.  Once it returns, the system
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconsiders the BroadcastReceiver to be no longer active, and thus, its hosting
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprocess no longer needed (unless other application components are active in
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectit).  So, the system may kill the process at any time to reclaim memory, and in doing so,
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectit terminates the spawned thread running in the process.  The solution to this problem
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectis to start a {@link android.app.Service} from the BroadcastReceiver, so the
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsystem knows that there is still active work being done in the process.</p>
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>To determine which processes should be killed when low on memory, Android
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectplaces each process into an "importance hierarchy" based on the components running in
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthem and the state of those components. These process types are (in order of importance):</p>
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<ol>
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<li>A <strong>foreground process</strong> is one that is required for
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectwhat the user is currently doing.  Various application components can
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectcause its containing process to be considered foreground in different
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectways.  A process is considered to be in the foreground if any of the
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfollowing conditions hold:
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project <ul>
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li> It is running an {@link android.app.Activity}
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  at the top of the screen that the user is interacting with (its
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  {@link android.app.Activity#onResume} method has been called).</li>
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li> It has a {@link android.content.BroadcastReceiver} that is currently running
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  (its {@link android.content.BroadcastReceiver#onReceive 
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  BroadcastReceiver.onReceive()} method is executing).</li>
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>It has a {@link android.app.Service} that is currently executing code
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  in one of its callbacks ({@link android.app.Service#onCreate Service.onCreate()},
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  {@link android.app.Service#onStart Service.onStart()}, or
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  {@link android.app.Service#onDestroy Service.onDestroy()}).</li>
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project </ul>
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</li>
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>There will only ever be a few such processes in the system, and these will only
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbe killed as a last resort if memory is so low that not even these processes
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectcan continue to run.  Generally, at this point, the device has
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectreached a memory paging state, so this action is required in order to keep the user
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinterface responsive.</p>
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</li>
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<li>A <strong>visible process</strong> is one holding an {@link android.app.Activity}
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthat is visible to the user on-screen but not in the foreground (its
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.app.Activity#onPause} method has been called).  This may
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectoccur, for example, if the foreground Activity is displayed as a dialog
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthat allows the previous Activity to be seen behind it.  Such a
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprocess is considered extremely important and will not be killed unless doing so is
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectrequired to keep all foreground processes running.
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</li>
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<li>A <strong>service process</strong> is one holding a {@link android.app.Service}
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthat has been started with the
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.content.Context#startService startService()} method.  Though these
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprocesses are not directly visible to the user, they are generally doing things
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthat the user cares about (such as background mp3 playback or background
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnetwork data upload or download), so the system will always keep such processes
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectrunning unless there is not enough memory to retain all foreground and visible process.
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</li>
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<li>A <strong>background process</strong> is one holding an {@link android.app.Activity}
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthat is not currently visible to the user  (its
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.app.Activity#onStop} method has been called).  These processes
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecthave no direct impact on the user experience.  Provided they implement
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttheir Activity life-cycle correctly
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project(see {@link android.app.Activity} for more details), the system
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectcan kill such processes at any time to reclaim memory for one of the three
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprevious processes types.  Usually there are many of these processes running,
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectso they are kept in an LRU list to ensure the process that was most recently seen
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectby the user is the last to be killed when running low on memory.
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</li>
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<li>An <strong>empty process</strong> is one that doesn't hold any active application
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectcomponents.  The only reason to keep such a process around is as a cache to
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimprove startup time the next time a component of its application needs to
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectrun.  As such, the system will often kill these processes in order to
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbalance overall system resources between these empty cached processes and the
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectunderlying kernel caches.
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</li>
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</ol>
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>When deciding how to classify a process, the system will base its decision on the most
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimportant level found among all the components currently active in the process.
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectSee the {@link android.app.Activity}, {@link android.app.Service}, and
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.content.BroadcastReceiver} documentation for more detail on how
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecteach of these components contribute to the overall life-cycle of a process.
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectThe documentation for each of these classes describes in more detail how
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthey impact the overall life-cycle of their application.</p>
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>A process's priority may also be increased based on other dependencies
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecta process has to it.  For example, if process A has bound to a
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.app.Service} with
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthe {@link android.content.Context#BIND_AUTO_CREATE Context.BIND_AUTO_CREATE}
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectflag or is using a
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.content.ContentProvider} in process B, then process B's
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclassification will always be at least as important as process A's.</p>
121