| page.title=Android Application Framework FAQ | |
| excludeFromSuggestions=true | |
| @jd:body | |
| <ul> | |
| <li><a href="#1">Do all the Activities and Services of an | |
| application run in a single process?</a></li> | |
| <li><a href="#2">Do all Activities run in the main thread of | |
| an application process?</a></li> | |
| <li><a href="#3">How do I pass complicated data structures | |
| from one Activity/Service to another?</a></li> | |
| <li><a href="#4">How can I check if an Activity is already | |
| running before starting it?</a></li> | |
| <li><a href="#5">If an Activity starts a remote service, is | |
| there any way for the Service to pass a message back to the Activity?</a></li> | |
| <li><a href="#6">How to avoid getting the Application not | |
| responding dialog?</a></li> | |
| <li><a href="#7">How does an application know if a package is | |
| added or removed?</a></li> | |
| </ul> | |
| <a name="1" id="1"></a> | |
| <h2>Do all the Activities and Services of an application run in a | |
| single process?</h2> | |
| <p>All Activities and Services in an application run in a single process by | |
| default. If needed, you can declare an <code>android:process</code> attribute | |
| in your manifest file, to explicitly place a component (Activity/Service) in | |
| another process.</p> | |
| <a name="2" id="2"></a> | |
| <h2>Do all Activities run in the main thread of an application | |
| process?</h2> | |
| <p>By default, all of the application code in a single process runs | |
| in the main UI thread. This is the same thread | |
| that also handles UI events. The only exception is the code that handles | |
| IPC calls coming in from other processes. The system maintains a | |
| separate pool of transaction threads in each process to dispatch all | |
| incoming IPC calls. The developer should create separate threads for any | |
| long-running code, to avoid blocking the main UI thread.</p> | |
| <a name="3" id="3"></a> | |
| <h2>How do I pass data between Activities/Services within a single | |
| application?</h2> | |
| <p>It depends on the type of data that you want to share:</p> | |
| <h3>Primitive Data Types</h3> | |
| <p>To share primitive data between Activities/Services in an | |
| application, use Intent.putExtras(). For passing primitive data that | |
| needs to persist use the | |
| <a href="{@docRoot}guide/topics/data/data-storage.html#preferences"> | |
| Preferences</a> storage mechanism.</p> | |
| <h3>Non-Persistent Objects</h3> | |
| <p>For sharing complex non-persistent user-defined objects for short | |
| duration, the following approaches are recommended: | |
| </p> | |
| <h4>Singleton class</h4> | |
| <p>You can take advantage of the fact that your application | |
| components run in the same process through the use of a singleton. | |
| This is a class that is designed to have only one instance. It | |
| has a static method with a name such as <code>getInstance()</code> | |
| that returns the instance; the first time this method is called, | |
| it creates the global instance. Because all callers get the same | |
| instance, they can use this as a point of interaction. For | |
| example activity A may retrieve the instance and call setValue(3); | |
| later activity B may retrieve the instance and call getValue() to | |
| retrieve the last set value.</p> | |
| <h4>A public static field/method</h4> | |
| <p>An alternate way to make data accessible across Activities/Services is to use <em>public static</em> | |
| fields and/or methods. You can access these static fields from any other | |
| class in your application. To share an object, the activity which creates your object sets a | |
| static field to point to this object and any other activity that wants to use | |
| this object just accesses this static field.</p> | |
| <h4>A HashMap of WeakReferences to Objects</h4> | |
| <p>You can also use a HashMap of WeakReferences to Objects with Long | |
| keys. When an activity wants to pass an object to another activity, it | |
| simply puts the object in the map and sends the key (which is a unique | |
| Long based on a counter or time stamp) to the recipient activity via | |
| intent extras. The recipient activity retrieves the object using this | |
| key.</p> | |
| <h3>Persistent Objects</h3> | |
| <p>Even while an application appears to continue running, the system | |
| may choose to kill its process and restart it later. If you have data | |
| that you need to persist from one activity invocation to the next, you | |
| need to represent that data as state that gets saved by an activity when | |
| it is informed that it might go away.</p> | |
| <p>For sharing complex persistent user-defined objects, the | |
| following approaches are recommended: | |
| <ul> | |
| <li>Application Preferences</li> | |
| <li>Files</li> | |
| <li>contentProviders</li> | |
| <li>SQLite DB</li> | |
| </ul> | |
| </p> | |
| <p>If the shared data needs to be retained across points where the application | |
| process can be killed, then place that data in persistent storage like | |
| Application Preferences, SQLite DB, Files or ContentProviders. Please refer to | |
| the <a href="{@docRoot}guide/topics/data/data-storage.html">Data Storage</a> | |
| for further details on how to use these components.</p> | |
| <a name="4" id="4"></a> | |
| <h2>How can I check if an Activity is already running before starting | |
| it?</h2> | |
| <p>The general mechanism to start a new activity if its not running— | |
| or to bring the activity stack to the front if is already running in the | |
| background— is the to use the NEW_TASK_LAUNCH flag in the startActivity() | |
| call.</p> | |
| <a name="5" id="5"></a> | |
| <h2>If an Activity starts a remote service, is there any way for the | |
| Service to pass a message back to the Activity?</h2> | |
| <p>See the {@link android.app.Service} documentation's for examples of | |
| how clients can interact with a service. You can take advantage of the | |
| fact that your components run in the same process to greatly simplify | |
| service interaction from the generic remote case, as shown by the "Local | |
| Service Sample". In some cases techniques like singletons may also make sense. | |
| <a name="6" id="6"></a> | |
| <h2>How to avoid getting the Application not responding dialog?</h2> | |
| <p>Please read the <a href="{@docRoot}guide/practices/design/responsiveness.html">Designing for Responsiveness</a> | |
| document.</p> | |
| <a name="7" id="7"></a> | |
| <h2>How does an application know if a package is added or removed? | |
| </h2> | |
| <p>Whenever a package is added, an intent with PACKAGE_ADDED action | |
| is broadcast by the system. Similarly when a package is removed, an | |
| intent with PACKAGE_REMOVED action is broadcast. To receive these | |
| intents, you should write something like this: | |
| <pre> | |
| <receiver android:name ="com.android.samples.app.PackageReceiver"> | |
| <intent-filter> | |
| <action android:name="android.intent.action.PACKAGE_ADDED"/> | |
| <action android:name="android.intent.action.PACKAGE_REMOVED"/> | |
| <data android:scheme="package" /> | |
| </intent-filter> | |
| </receiver> | |
| </pre> | |
| <br> | |
| Here PackageReceiver is a BroadcastReceiver class.Its onReceive() | |
| method is invoked, every time an application package is installed or | |
| removed. | |
| </p> | |