framework.jd revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpage.title=Android Application Framework FAQ
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectparent.title=FAQs, Tips, and How-to
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectparent.link=index.html
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@jd:body
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<ul>
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li><a href="#1">Do all the Activities and Services of an
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  application run in a single process?</a></li>
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li><a href="#2">Do all Activities run in the main thread of
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  an application process?</a></li>
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li><a href="#3">How do I pass complicated data structures
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  from one Activity/Service to another?</a></li>
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li><a href="#4">How can I check if an Activity is already
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  running before starting it?</a></li>
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li><a href="#5">If an Activity starts a remote service,is
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  there any way for the Service to pass a message back to the Activity?</a></li>
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li><a href="#6">How to avoid getting the Application not
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  responding dialog?</a></li>
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li><a href="#7">How does an application know if a package is
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  added or removed?</a></li>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</ul>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<!-- ------------------------------------------------------------------ -->
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<a name="1" id="1"></a>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<h2>Do all the Activities and Services of an application run in a
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsingle process?</h2>
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>All Activities and Services in an application run in a single process by
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdefault. If needed, you can declare an <code>android:process</code> attribute
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectin your manifest file, to explicitly place a component (Activity/Service) in
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectanother process.</p>
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<!-- ------------------------------------------------------------------ -->
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<a name="2" id="2"></a>
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<h2>Do all Activities run in the main thread of an application
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprocess?</h2>
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>By default, all of the application code in a single process runs
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectin the main UI thread. This is the same thread
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthat also handles UI events. The only exception is the code that handles
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectIPC calls coming in from other processes. The system maintains a
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectseparate pool of transaction threads in each process to dispatch all
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectincoming IPC calls. The developer should create separate threads for any
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectlong-running code, to avoid blocking the main UI thread.</p>
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<!-- ------------------------------------------------------------------ -->
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<a name="3" id="3"></a>
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<h2>How do I pass data between Activities/Services within a single
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectapplication?</h2>
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>It depends on the type of data that you want to share:</p>
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<h3>Primitive Data Types</h3>
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>To share primitive data between Activities/Services in an
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectapplication, use Intent.putExtras(). For passing primitive data that
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectneeds to persist use the 
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<a href="{@docRoot}guide/topics/data/data-storage.html#preferences">
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectPreferences</a> storage mechanism.</p>
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<h3>Non-Persistent Objects</h3>
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>For sharing complex non-persistent user-defined objects for short
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectduration, the following approaches are recommended:
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</p>
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <h4>The android.app.Application class</h4>
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <p>The android.app.Application is a base class for those who need to
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmaintain global application state. It can be accessed via
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectgetApplication() from any Activity or Service. It has a couple of
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectlife-cycle methods and will be instantiated by Android automatically if
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectyour register it in AndroidManifest.xml.</p>
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <h4>A public static field/method</h4>
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <p>An alternate way to make data accessible across Activities/Services is to use <em>public static</em>
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfields and/or methods. You can access these static fields from any other
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass in your application. To share an object, the activity which creates your object sets a
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic field to point to this object and any other activity that wants to use
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthis object just accesses this static field.</p>
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <h4>A HashMap of WeakReferences to Objects</h4>
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <p>You can also use a HashMap of WeakReferences to Objects with Long
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectkeys. When an activity wants to pass an object to another activity, it
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsimply puts the object in the map and sends the key (which is a unique
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectLong based on a counter or time stamp) to the recipient activity via
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectintent extras. The recipient activity retrieves the object using this
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectkey.</p>
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <h4>A Singleton class</h4>
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <p>There are advantages to using a static Singleton, such as you can
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectrefer to them without casting getApplication() to an
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectapplication-specific class, or going to the trouble of hanging an
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinterface on all your Application subclasses so that your various
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmodules can refer to that interface instead. </p>
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>But, the life cycle of a static is not well under your control; so
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectto abide by the life-cycle model, the application class should initiate and
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttear down these static objects in the onCreate() and onTerminate() methods
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectof the Application Class</p>
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</p>
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<h3>Persistent Objects</h3>
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>Even while an application appears to continue running, the system
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmay choose to kill its process and restart it later. If you have data
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthat you need to persist from one activity invocation to the next, you
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectneed to represent that data as state that gets saved by an activity when
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectit is informed that it might go away.</p>
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>For sharing complex persistent user-defined objects, the
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfollowing approaches are recommended:
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<ul>
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>Application Preferences</li>
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>Files</li>
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>contentProviders</li>
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <li>SQLite DB</li>
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</ul>
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</p>
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>If the shared data needs to be retained across points where the application
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprocess can be killed, then place that data in persistent storage like
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectApplication Preferences, SQLite DB, Files or ContentProviders. Please refer to
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectthe <a href="{@docRoot}guide/topics/data/data-storage.html">Data Storage</a>
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfor further details on how to use these components.</p>
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<!-- ------------------------------------------------------------------ -->
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<a name="4" id="4"></a>
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<h2>How can I check if an Activity is already running before starting
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectit?</h2>
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>The general mechanism to start a new activity if its not running&mdash;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projector to bring the activity stack to the front if is already running in the
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbackground&mdash; is the to use the NEW_TASK_LAUNCH flag in the startActivity()
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectcall.</p>
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<!-- ------------------------------------------------------------------ -->
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<a name="5" id="5"></a>
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<h2>If an Activity starts a remote service, is there any way for the
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectService to pass a message back to the Activity?</h2>
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>The remote service can define a callback interface and register it with the
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclients to callback into the clients. The 
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{@link android.os.RemoteCallbackList RemoteCallbackList} class provides methods to
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectregister and unregister clients with the service, and send and receive
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmessages.</p>
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>The sample code for remote service callbacks is given in <a
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecthref="{@docRoot}guide/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.html">ApiDemos/RemoteService</a></p>
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<!-- ------------------------------------------------------------------ -->
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<a name="6" id="6"></a>
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<h2>How to avoid getting the Application not responding dialog?</h2>
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>Please read the <a href="{@docRoot}guide/practices/design/responsiveness.html">Designing for Responsiveness</a> 
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdocument.</p>
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<!-- ------------------------------------------------------------------ -->
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<a name="7" id="7"></a>
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<h2>How does an application know if a package is added or removed?
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</h2>
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<p>Whenever a package is added, an intent with PACKAGE_ADDED action
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectis broadcast by the system. Similarly when a package is removed, an
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectintent with PACKAGE_REMOVED action is broadcast. To receive these
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectintents, you should write something like this:
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<pre>
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       &lt;receiver android:name ="com.android.samples.app.PackageReceiver"&gt;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            &lt;intent-filter&gt;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             &lt;action android:name="android.intent.action.PACKAGE_ADDED"/&gt;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              &lt;action android:name="android.intent.action.PACKAGE_REMOVED"/&gt;            
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              &lt;data android:scheme="package" /&gt;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            &lt;/intent-filter&gt;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        &lt;/receiver&gt;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  </pre>
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project  <br>
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectHere PackageReceiver is a BroadcastReceiver class.Its onReceive()
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectmethod is invoked, every time an application package is installed or
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectremoved.
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project</p>
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project<!-- ------------------------------------------------------------------ -->
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199