| Scott Main | 50e990c | 2012-06-21 17:14:39 -0700 | [diff] [blame] | 1 | page.title=Application Fundamentals |
| 2 | @jd:body |
| 3 | |
| 4 | <div id="qv-wrapper"> |
| 5 | <div id="qv"> |
| 6 | |
| 7 | <h2>Quickview</h2> |
| 8 | <ul> |
| 9 | <li>Android applications are composed of one or more application components (activities, |
| 10 | services, content providers, and broadcast receivers)</li> |
| 11 | <li>Each component performs a different role in the overall application behavior, and each |
| 12 | one can be activated individually (even by other applications)</li> |
| 13 | <li>The manifest file must declare all components in the application and should also declare |
| 14 | all application requirements, such as the minimum version of Android required and any hardware |
| 15 | configurations required</li> |
| 16 | <li>Non-code application resources (images, strings, layout files, etc.) should include |
| 17 | alternatives for different device configurations (such as different strings for different |
| 18 | languages and different layouts for different screen sizes)</li> |
| 19 | </ul> |
| 20 | |
| 21 | |
| 22 | <h2>In this document</h2> |
| 23 | <ol> |
| 24 | <li><a href="#Components">Application Components</a> |
| 25 | <ol> |
| 26 | <li><a href="#ActivatingComponents">Activating components</a></li> |
| 27 | </ol> |
| 28 | </li> |
| 29 | <li><a href="#Manifest">The Manifest File</a> |
| 30 | <ol> |
| 31 | <li><a href="#DeclaringComponents">Declaring components</a></li> |
| 32 | <li><a href="#DeclaringRequirements">Declaring application requirements</a></li> |
| 33 | </ol> |
| 34 | </li> |
| 35 | <li><a href="#Resources">Application Resources</a></li> |
| 36 | </ol> |
| 37 | </div> |
| 38 | </div> |
| 39 | |
| 40 | <p>Android applications are written in the Java programming language. The Android SDK tools compile |
| 41 | the code—along with any data and resource files—into an <i>Android package</i>, an |
| 42 | archive file with an {@code .apk} suffix. All the code in a single {@code .apk} file is considered |
| 43 | to be one application and is the file that Android-powered devices use to install the |
| 44 | application.</p> |
| 45 | |
| 46 | <p>Once installed on a device, each Android application lives in its own security sandbox: </p> |
| 47 | |
| 48 | <ul> |
| 49 | <li>The Android operating system is a multi-user Linux system in which each application is a |
| 50 | different user.</li> |
| 51 | |
| 52 | <li>By default, the system assigns each application a unique Linux user ID (the ID is used only by |
| 53 | the system and is unknown to the application). The system sets permissions for all the files in an |
| 54 | application so that only the user ID assigned to that application can access them. </li> |
| 55 | |
| 56 | <li>Each process has its own virtual machine (VM), so an application's code runs in isolation from |
| 57 | other applications.</li> |
| 58 | |
| 59 | <li>By default, every application runs in its own Linux process. Android starts the process when any |
| 60 | of the application's components need to be executed, then shuts down the process when it's no longer |
| 61 | needed or when the system must recover memory for other applications.</li> |
| 62 | </ul> |
| 63 | |
| 64 | <p>In this way, the Android system implements the <em>principle of least privilege</em>. That is, |
| 65 | each application, by default, has access only to the components that it requires to do its work and |
| 66 | no more. This creates a very secure environment in which an application cannot access parts of |
| 67 | the system for which it is not given permission.</p> |
| 68 | |
| 69 | <p>However, there are ways for an application to share data with other applications and for an |
| 70 | application to access system services:</p> |
| 71 | |
| 72 | <ul> |
| 73 | <li>It's possible to arrange for two applications to share the same Linux user ID, in which case |
| 74 | they are able to access each other's files. To conserve system resources, applications with the |
| 75 | same user ID can also arrange to run in the same Linux process and share the same VM (the |
| 76 | applications must also be signed with the same certificate).</li> |
| 77 | <li>An application can request permission to access device data such as the user's |
| 78 | contacts, SMS messages, the mountable storage (SD card), camera, Bluetooth, and more. All |
| 79 | application permissions must be granted by the user at install time.</li> |
| 80 | </ul> |
| 81 | |
| 82 | <p>That covers the basics regarding how an Android application exists within the system. The rest of |
| 83 | this document introduces you to:</p> |
| 84 | <ul> |
| 85 | <li>The core framework components that define your application.</li> |
| 86 | <li>The manifest file in which you declare components and required device features for your |
| 87 | application.</li> |
| 88 | <li>Resources that are separate from the application code and allow your application to |
| 89 | gracefully optimize its behavior for a variety of device configurations.</li> |
| 90 | </ul> |
| 91 | |
| 92 | <!-- |
| 93 | <p class="note"><strong>Tip:</strong> If you're new to Android development, we suggest that you |
| 94 | follow the Beginner's Path link at the bottom of this page. For each document in the Application |
| 95 | Fundamentals, the Beginner's Path points you to the document we suggest you read next, in order |
| 96 | to get up to speed on the core Android concepts.</p> |
| 97 | --> |
| 98 | |
| 99 | |
| 100 | <h2 id="Components">Application Components</h2> |
| 101 | |
| 102 | <p>Application components are the essential building blocks of an Android application. Each |
| 103 | component is a different point through which the system can enter your application. Not all |
| 104 | components are actual entry points for the user and some depend on each other, but each one exists |
| 105 | as its own entity and plays a specific role—each one is a unique building block that |
| 106 | helps define your application's overall behavior.</p> |
| 107 | |
| 108 | <p>There are four different types of application components. Each type serves a distinct purpose |
| 109 | and has a distinct lifecycle that defines how the component is created and destroyed.</p> |
| 110 | |
| 111 | <p>Here are the four types of application components:</p> |
| 112 | |
| 113 | <dl> |
| 114 | |
| 115 | <dt><b>Activities</b></dt> |
| 116 | |
| 117 | <dd>An <i>activity</i> represents a single screen with a user interface. For example, |
| 118 | an email application might have one activity that shows a list of new |
| 119 | emails, another activity to compose an email, and another activity for reading emails. Although |
| 120 | the activities work together to form a cohesive user experience in the email application, each one |
| 121 | is independent of the others. As such, a different application can start any one of these |
| 122 | activities (if the email application allows it). For example, a camera application can start the |
| 123 | activity in the email application that composes new mail, in order for the user to share a picture. |
| 124 | |
| 125 | <p>An activity is implemented as a subclass of {@link android.app.Activity} and you can learn more |
| 126 | about it in the <a href="{@docRoot}guide/components/activities.html">Activities</a> |
| 127 | developer guide.</p> |
| 128 | </dd> |
| 129 | |
| 130 | |
| 131 | <dt><b>Services</b></dt> |
| 132 | |
| 133 | <dd>A <i>service</i> is a component that runs in the background to perform long-running |
| 134 | operations or to perform work for remote processes. A service |
| 135 | does not provide a user interface. For example, a service might play music in the background while |
| 136 | the user is in a different application, or it might fetch data over the network without |
| 137 | blocking user interaction with an activity. Another component, such as an activity, can start the |
| 138 | service and let it run or bind to it in order to interact with it. |
| 139 | |
| 140 | <p>A service is implemented as a subclass of {@link android.app.Service} and you can learn more |
| 141 | about it in the <a href="{@docRoot}guide/components/services.html">Services</a> developer |
| 142 | guide.</p> |
| 143 | </dd> |
| 144 | |
| 145 | |
| 146 | <dt><b>Content providers</b></dt> |
| 147 | |
| 148 | <dd>A <i>content provider</i> manages a shared set of application data. You can store the data in |
| 149 | the file system, an SQLite database, on the web, or any other persistent storage location your |
| 150 | application can access. Through the content provider, other applications can query or even modify |
| 151 | the data (if the content provider allows it). For example, the Android system provides a content |
| 152 | provider that manages the user's contact information. As such, any application with the proper |
| 153 | permissions can query part of the content provider (such as {@link |
| 154 | android.provider.ContactsContract.Data}) to read and write information about a particular person. |
| 155 | |
| 156 | <p>Content providers are also useful for reading and writing data that is private to your |
| 157 | application and not shared. For example, the <a |
| 158 | href="{@docRoot}resources/samples/NotePad/index.html">Note Pad</a> sample application uses a |
| 159 | content provider to save notes.</p> |
| 160 | |
| 161 | <p>A content provider is implemented as a subclass of {@link android.content.ContentProvider} |
| 162 | and must implement a standard set of APIs that enable other applications to perform |
| 163 | transactions. For more information, see the <a |
| 164 | href="{@docRoot}guide/topics/providers/content-providers.html">Content Providers</a> developer |
| 165 | guide.</p> |
| 166 | </dd> |
| 167 | |
| 168 | |
| 169 | <dt><b>Broadcast receivers</b></dt> |
| 170 | |
| 171 | <dd>A <i>broadcast receiver</i> is a component that responds to system-wide broadcast |
| 172 | announcements. Many broadcasts originate from the system—for example, a broadcast announcing |
| 173 | that the screen has turned off, the battery is low, or a picture was captured. |
| 174 | Applications can also initiate broadcasts—for example, to let other applications know that |
| 175 | some data has been downloaded to the device and is available for them to use. Although broadcast |
| 176 | receivers don't display a user interface, they may <a |
| 177 | href="{@docRoot}guide/topics/ui/notifiers/notifications.html">create a status bar notification</a> |
| 178 | to alert the user when a broadcast event occurs. More commonly, though, a broadcast receiver is |
| 179 | just a "gateway" to other components and is intended to do a very minimal amount of work. For |
| 180 | instance, it might initiate a service to perform some work based on the event. |
| 181 | |
| 182 | <p>A broadcast receiver is implemented as a subclass of {@link android.content.BroadcastReceiver} |
| 183 | and each broadcast is delivered as an {@link android.content.Intent} object. For more information, |
| 184 | see the {@link android.content.BroadcastReceiver} class.</p> |
| 185 | </dd> |
| 186 | |
| 187 | </dl> |
| 188 | |
| 189 | |
| 190 | |
| 191 | <p>A unique aspect of the Android system design is that any application can start another |
| 192 | application’s component. For example, if you want the user to capture a |
| 193 | photo with the device camera, there's probably another application that does that and your |
| 194 | application can use it, instead of developing an activity to capture a photo yourself. You don't |
| 195 | need to incorporate or even link to the code from the camera application. |
| 196 | Instead, you can simply start the activity in the camera application that captures a |
| 197 | photo. When complete, the photo is even returned to your application so you can use it. To the user, |
| 198 | it seems as if the camera is actually a part of your application.</p> |
| 199 | |
| 200 | <p>When the system starts a component, it starts the process for that application (if it's not |
| 201 | already running) and instantiates the classes needed for the component. For example, if your |
| 202 | application starts the activity in the camera application that captures a photo, that activity |
| 203 | runs in the process that belongs to the camera application, not in your application's process. |
| 204 | Therefore, unlike applications on most other systems, Android applications don't have a single entry |
| 205 | point (there's no {@code main()} function, for example).</p> |
| 206 | |
| 207 | <p>Because the system runs each application in a separate process with file permissions that |
| 208 | restrict access to other applications, your application cannot directly activate a component from |
| 209 | another application. The Android system, however, can. So, to activate a component in |
| 210 | another application, you must deliver a message to the system that specifies your <em>intent</em> to |
| 211 | start a particular component. The system then activates the component for you.</p> |
| 212 | |
| 213 | |
| 214 | <h3 id="ActivatingComponents">Activating Components</h3> |
| 215 | |
| 216 | <p>Three of the four component types—activities, services, and |
| 217 | broadcast receivers—are activated by an asynchronous message called an <em>intent</em>. |
| 218 | Intents bind individual components to each other at runtime (you can think of them |
| 219 | as the messengers that request an action from other components), whether the component belongs |
| 220 | to your application or another.</p> |
| 221 | |
| 222 | <p>An intent is created with an {@link android.content.Intent} object, which defines a message to |
| 223 | activate either a specific component or a specific <em>type</em> of component—an intent |
| 224 | can be either explicit or implicit, respectively.</p> |
| 225 | |
| 226 | <p>For activities and services, an intent defines the action to perform (for example, to "view" or |
| 227 | "send" something) and may specify the URI of the data to act on (among other things that the |
| 228 | component being started might need to know). For example, an intent might convey a request for an |
| 229 | activity to show an image or to open a web page. In some cases, you can start an |
| 230 | activity to receive a result, in which case, the activity also returns |
| 231 | the result in an {@link android.content.Intent} (for example, you can issue an intent to let |
| 232 | the user pick a personal contact and have it returned to you—the return intent includes a |
| 233 | URI pointing to the chosen contact).</p> |
| 234 | |
| 235 | <p>For broadcast receivers, the intent simply defines the |
| 236 | announcement being broadcast (for example, a broadcast to indicate the device battery is low |
| 237 | includes only a known action string that indicates "battery is low").</p> |
| 238 | |
| 239 | <p>The other component type, content provider, is not activated by intents. Rather, it is |
| 240 | activated when targeted by a request from a {@link android.content.ContentResolver}. The content |
| 241 | resolver handles all direct transactions with the content provider so that the component that's |
| 242 | performing transactions with the provider doesn't need to and instead calls methods on the {@link |
| 243 | android.content.ContentResolver} object. This leaves a layer of abstraction between the content |
| 244 | provider and the component requesting information (for security).</p> |
| 245 | |
| 246 | <p>There are separate methods for activating each type of component:</p> |
| 247 | <ul> |
| 248 | <li>You can start an activity (or give it something new to do) by |
| 249 | passing an {@link android.content.Intent} to {@link android.content.Context#startActivity |
| 250 | startActivity()} or {@link android.app.Activity#startActivityForResult startActivityForResult()} |
| 251 | (when you want the activity to return a result).</li> |
| 252 | <li>You can start a service (or give new instructions to an ongoing service) by |
| 253 | passing an {@link android.content.Intent} to {@link android.content.Context#startService |
| 254 | startService()}. Or you can bind to the service by passing an {@link android.content.Intent} to |
| 255 | {@link android.content.Context#bindService bindService()}.</li> |
| 256 | <li>You can initiate a broadcast by passing an {@link android.content.Intent} to methods like |
| 257 | {@link android.content.Context#sendBroadcast(Intent) sendBroadcast()}, {@link |
| 258 | android.content.Context#sendOrderedBroadcast(Intent, String) sendOrderedBroadcast()}, or {@link |
| 259 | android.content.Context#sendStickyBroadcast sendStickyBroadcast()}.</li> |
| 260 | <li>You can perform a query to a content provider by calling {@link |
| 261 | android.content.ContentProvider#query query()} on a {@link android.content.ContentResolver}.</li> |
| 262 | </ul> |
| 263 | |
| 264 | <p>For more information about using intents, see the <a |
| 265 | href="{@docRoot}guide/components/intents-filters.html">Intents and |
| 266 | Intent Filters</a> document. More information about activating specific components is also provided |
| 267 | in the following documents: <a |
| 268 | href="{@docRoot}guide/components/activities.html">Activities</a>, <a |
| 269 | href="{@docRoot}guide/components/services.html">Services</a>, {@link |
| 270 | android.content.BroadcastReceiver} and <a |
| 271 | href="{@docRoot}guide/topics/providers/content-providers.html">Content Providers</a>.</p> |
| 272 | |
| 273 | |
| 274 | <h2 id="Manifest">The Manifest File</h2> |
| 275 | |
| 276 | <p>Before the Android system can start an application component, the system must know that the |
| 277 | component exists by reading the application's {@code AndroidManifest.xml} file (the "manifest" |
| 278 | file). Your application must declare all its components in this file, which must be at the root of |
| 279 | the application project directory.</p> |
| 280 | |
| 281 | <p>The manifest does a number of things in addition to declaring the application's components, |
| 282 | such as:</p> |
| 283 | <ul> |
| 284 | <li>Identify any user permissions the application requires, such as Internet access or |
| 285 | read-access to the user's contacts.</li> |
| 286 | <li>Declare the minimum <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">API Level</a> |
| 287 | required by the application, based on which APIs the application uses.</li> |
| 288 | <li>Declare hardware and software features used or required by the application, such as a camera, |
| 289 | bluetooth services, or a multitouch screen.</li> |
| 290 | <li>API libraries the application needs to be linked against (other than the Android framework |
| 291 | APIs), such as the <a |
| 292 | href="http://code.google.com/android/add-ons/google-apis/maps-overview.html">Google Maps |
| 293 | library</a>.</li> |
| 294 | <li>And more</li> |
| 295 | </ul> |
| 296 | |
| 297 | |
| 298 | <h3 id="DeclaringComponents">Declaring components</h3> |
| 299 | |
| 300 | <p>The primary task of the manifest is to inform the system about the application's components. For |
| 301 | example, a manifest file can declare an activity as follows: </p> |
| 302 | |
| 303 | <pre> |
| 304 | <?xml version="1.0" encoding="utf-8"?> |
| 305 | <manifest ... > |
| 306 | <application android:icon="@drawable/app_icon.png" ... > |
| 307 | <activity android:name="com.example.project.ExampleActivity" |
| 308 | android:label="@string/example_label" ... > |
| 309 | </activity> |
| 310 | ... |
| 311 | </application> |
| 312 | </manifest></pre> |
| 313 | |
| 314 | <p>In the <code><a |
| 315 | href="{@docRoot}guide/topics/manifest/application-element.html"><application></a></code> |
| 316 | element, the {@code android:icon} attribute points to resources for an icon that identifies the |
| 317 | application.</p> |
| 318 | |
| 319 | <p>In the <code><a |
| 320 | href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> element, |
| 321 | the {@code android:name} attribute specifies the fully qualified class name of the {@link |
| 322 | android.app.Activity} subclass and the {@code android:label} attributes specifies a string |
| 323 | to use as the user-visible label for the activity.</p> |
| 324 | |
| 325 | <p>You must declare all application components this way:</p> |
| 326 | <ul> |
| 327 | <li><code><a |
| 328 | href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> elements |
| 329 | for activities</li> |
| 330 | <li><code><a |
| 331 | href="{@docRoot}guide/topics/manifest/service-element.html"><service></a></code> elements for |
| 332 | services</li> |
| 333 | <li><code><a |
| 334 | href="{@docRoot}guide/topics/manifest/receiver-element.html"><receiver></a></code> elements |
| 335 | for broadcast receivers</li> |
| 336 | <li><code><a |
| 337 | href="{@docRoot}guide/topics/manifest/provider-element.html"><provider></a></code> elements |
| 338 | for content providers</li> |
| 339 | </ul> |
| 340 | |
| 341 | <p>Activities, services, and content providers that you include in your source but do not declare |
| 342 | in the manifest are not visible to the system and, consequently, can never run. However, |
| 343 | broadcast |
| 344 | receivers can be either declared in the manifest or created dynamically in code (as |
| 345 | {@link android.content.BroadcastReceiver} objects) and registered with the system by calling |
| 346 | {@link android.content.Context#registerReceiver registerReceiver()}.</p> |
| 347 | |
| 348 | <p>For more about how to structure the manifest file for your application, see the <a |
| 349 | href="{@docRoot}guide/topics/manifest/manifest-intro.html">The AndroidManifest.xml File</a> |
| 350 | documentation. </p> |
| 351 | |
| 352 | |
| 353 | |
| 354 | <h3 id="DeclaringComponentCapabilities">Declaring component capabilities</h3> |
| 355 | |
| 356 | <p>As discussed above, in <a href="#ActivatingComponents">Activating Components</a>, you can use an |
| 357 | {@link android.content.Intent} to start activities, services, and broadcast receivers. You can do so |
| 358 | by explicitly naming the target component (using the component class name) in the intent. However, |
| 359 | the real power of intents lies in the concept of intent actions. With intent actions, you simply |
| 360 | describe the type of action you want to perform (and optionally, the data upon which you’d like to |
| 361 | perform the action) and allow the system to find a component on the device that can perform the |
| 362 | action and start it. If there are multiple components that can perform the action described by the |
| 363 | intent, then the user selects which one to use.</p> |
| 364 | |
| 365 | <p>The way the system identifies the components that can respond to an intent is by comparing the |
| 366 | intent received to the <i>intent filters</i> provided in the manifest file of other applications on |
| 367 | the device.</p> |
| 368 | |
| 369 | <p>When you declare a component in your application's manifest, you can optionally include |
| 370 | intent filters that declare the capabilities of the component so it can respond to intents |
| 371 | from other applications. You can declare an intent filter for your component by |
| 372 | adding an <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code |
| 373 | <intent-filter>}</a> element as a child of the component's declaration element.</p> |
| 374 | |
| 375 | <p>For example, an email application with an activity for composing a new email might declare an |
| 376 | intent filter in its manifest entry to respond to "send" intents (in order to send email). An |
| 377 | activity in your application can then create an intent with the “send” action ({@link |
| 378 | android.content.Intent#ACTION_SEND}), which the system matches to the email application’s “send” |
| 379 | activity and launches it when you invoke the intent with {@link android.app.Activity#startActivity |
| 380 | startActivity()}.</p> |
| 381 | |
| 382 | <p>For more about creating intent filters, see the <a |
| 383 | href="{@docRoot}guide/components/intents-filters.html">Intents and Intent Filters</a> document. |
| 384 | </p> |
| 385 | |
| 386 | |
| 387 | |
| 388 | <h3 id="DeclaringRequirements">Declaring application requirements</h3> |
| 389 | |
| 390 | <p>There are a variety of devices powered by Android and not all of them provide the |
| 391 | same features and capabilities. In order to prevent your application from being installed on devices |
| 392 | that lack features needed by your application, it's important that you clearly define a profile for |
| 393 | the types of devices your application supports by declaring device and software requirements in your |
| 394 | manifest file. Most of these declarations are informational only and the system does not read |
| 395 | them, but external services such as Google Play do read them in order to provide filtering |
| 396 | for users when they search for applications from their device.</p> |
| 397 | |
| 398 | <p>For example, if your application requires a camera and uses APIs introduced in Android 2.1 (<a |
| 399 | href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">API Level</a> 7), you should declare these as |
| 400 | requirements in your manifest file. That way, devices that do <em>not</em> have a camera and have an |
| 401 | Android version <em>lower</em> than 2.1 cannot install your application from Google Play.</p> |
| 402 | |
| 403 | <p>However, you can also declare that your application uses the camera, but does not |
| 404 | <em>require</em> it. In that case, your application must perform a check at runtime to determine |
| 405 | if the device has a camera and disable any features that use the camera if one is not available.</p> |
| 406 | |
| 407 | <p>Here are some of the important device characteristics that you should consider as you design and |
| 408 | develop your application:</p> |
| 409 | |
| 410 | <dl> |
| 411 | <dt>Screen size and density</dt> |
| 412 | <dd>In order to categorize devices by their screen type, Android defines two characteristics for |
| 413 | each device: screen size (the physical dimensions of the screen) and screen density (the physical |
| 414 | density of the pixels on the screen, or dpi—dots per inch). To simplify all the different |
| 415 | types of screen configurations, the Android system generalizes them into select groups that make |
| 416 | them easier to target. |
| 417 | <p>The screen sizes are: small, normal, large, and extra large.<br/> |
| 418 | The screen densities are: low density, medium density, high density, and extra high density.</p> |
| 419 | |
| 420 | <p>By default, your application is compatible with all screen sizes and densities, |
| 421 | because the Android system makes the appropriate adjustments to your UI layout and image |
| 422 | resources. However, you should create specialized layouts for certain screen sizes and provide |
| 423 | specialized images for certain densities, using alternative layout resources, and by declaring in |
| 424 | your manifest exactly which screen sizes your application supports with the <a |
| 425 | href="{@docRoot}guide/topics/manifest/supports-screens-element.html">{@code |
| 426 | <supports-screens>}</a> element.</p> |
| 427 | <p>For more information, see the <a |
| 428 | href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple Screens</a> |
| 429 | document.</p></dd> |
| 430 | |
| 431 | <dt>Input configurations</dt> |
| 432 | <dd>Many devices provide a different type of user input mechanism, such as a hardware keyboard, a |
| 433 | trackball, or a five-way navigation pad. If your application requires a particular kind of input |
| 434 | hardware, then you should declare it in your manifest with the <a |
| 435 | href="{@docRoot}guide/topics/manifest/uses-configuration-element.html">{@code |
| 436 | <uses-configuration>}</a> element. However, it is rare that an application should require |
| 437 | a certain input configuration.</dd> |
| 438 | |
| 439 | <dt>Device features</dt> |
| 440 | <dd>There are many hardware and software features that may or may not exist on a given |
| 441 | Android-powered device, such as a camera, a light sensor, bluetooth, a certain |
| 442 | version of OpenGL, or the fidelity of the touchscreen. You should never assume that a certain |
| 443 | feature is available on all Android-powered devices (other than the availability of the standard |
| 444 | Android library), so you should declare any features used by your application with the <a |
| 445 | href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a> |
| 446 | element.</dd> |
| 447 | |
| 448 | <dt>Platform Version</dt> |
| 449 | <dd>Different Android-powered devices often run different versions of the Android platform, |
| 450 | such as Android 1.6 or Android 2.3. Each successive version often includes additional APIs not |
| 451 | available in the previous version. In order to indicate which set of APIs are available, each |
| 452 | platform version specifies an <a |
| 453 | href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">API Level</a> (for example, Android 1.0 is API Level |
| 454 | 1 and Android 2.3 is API Level 9). If you use any APIs that were added to the platform after |
| 455 | version 1.0, you should declare the minimum API Level in which those APIs were introduced using the |
| 456 | <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html">{@code <uses-sdk>}</a> |
| 457 | element.</dd> |
| 458 | </dl> |
| 459 | |
| 460 | <p>It's important that you declare all such requirements for your application, because, when you |
| 461 | distribute your application on Google Play, the store uses these declarations to filter which |
| 462 | applications are available on each device. As such, your application should be available only to |
| 463 | devices that meet all your application requirements.</p> |
| 464 | |
| 465 | <p>For more information about how Google Play filters applications based on these (and other) |
| Dirk Dougherty | 2b286bb | 2012-11-29 17:25:09 -0800 | [diff] [blame] | 466 | requirements, see the <a href="{@docRoot}google/play/filters.html">Filters on Google Play</a> |
| Scott Main | 50e990c | 2012-06-21 17:14:39 -0700 | [diff] [blame] | 467 | document.</p> |
| 468 | |
| 469 | |
| 470 | |
| 471 | <h2 id="Resources">Application Resources</h2> |
| 472 | |
| 473 | <p>An Android application is composed of more than just code—it requires resources that are |
| 474 | separate from the source code, such as images, audio files, and anything relating to the visual |
| 475 | presentation of the application. For example, you should define animations, menus, styles, colors, |
| 476 | and the layout of activity user interfaces with XML files. Using application resources makes it easy |
| 477 | to update various characteristics of your application without modifying code and—by providing |
| 478 | sets of alternative resources—enables you to optimize your application for a variety of |
| 479 | device configurations (such as different languages and screen sizes).</p> |
| 480 | |
| 481 | <p>For every resource that you include in your Android project, the SDK build tools define a unique |
| 482 | integer ID, which you can use to reference the resource from your application code or from |
| 483 | other resources defined in XML. For example, if your application contains an image file named {@code |
| 484 | logo.png} (saved in the {@code res/drawable/} directory), the SDK tools generate a resource ID |
| 485 | named {@code R.drawable.logo}, which you can use to reference the image and insert it in your |
| 486 | user interface.</p> |
| 487 | |
| 488 | <p>One of the most important aspects of providing resources separate from your source code |
| 489 | is the ability for you to provide alternative resources for different device |
| 490 | configurations. For example, by defining UI strings in XML, you can translate the strings into other |
| 491 | languages and save those strings in separate files. Then, based on a language <em>qualifier</em> |
| 492 | that you append to the resource directory's name (such as {@code res/values-fr/} for French string |
| 493 | values) and the user's language setting, the Android system applies the appropriate language strings |
| 494 | to your UI.</p> |
| 495 | |
| 496 | <p>Android supports many different <em>qualifiers</em> for your alternative resources. The |
| 497 | qualifier is a short string that you include in the name of your resource directories in order to |
| 498 | define the device configuration for which those resources should be used. As another |
| 499 | example, you should often create different layouts for your activities, depending on the |
| 500 | device's screen orientation and size. For example, when the device screen is in portrait |
| 501 | orientation (tall), you might want a layout with buttons to be vertical, but when the screen is in |
| 502 | landscape orientation (wide), the buttons should be aligned horizontally. To change the layout |
| 503 | depending on the orientation, you can define two different layouts and apply the appropriate |
| 504 | qualifier to each layout's directory name. Then, the system automatically applies the appropriate |
| 505 | layout depending on the current device orientation.</p> |
| 506 | |
| 507 | <p>For more about the different kinds of resources you can include in your application and how |
| 508 | to create alternative resources for various device configurations, see the <a |
| 509 | href="{@docRoot}guide/topics/resources/index.html">Application Resources</a> developer guide.</p> |
| 510 | |
| 511 | |
| 512 | <!-- |
| 513 | <h2>Beginner's Path</h2> |
| 514 | |
| 515 | <p>For a close look at implementing activities—the components your users use to |
| 516 | interact with your application—continue with the <b><a |
| 517 | href="{@docRoot}guide/components/activities.html">Activities</a></b> document.</p> |
| 518 | --> |