2009-03-03 19:31:44 -08:00
|
|
|
|
page.title=Application Fundamentals
|
|
|
|
|
@jd:body
|
|
|
|
|
|
|
|
|
|
<div id="qv-wrapper">
|
|
|
|
|
<div id="qv">
|
|
|
|
|
|
|
|
|
|
<h2>In this document</h2>
|
|
|
|
|
<ol>
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<li><a href="#Components">App Components</a>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
<ol>
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<li><a href="#ActivatingComponents">Activating components</a></li>
|
|
|
|
|
</ol>
|
|
|
|
|
</li>
|
|
|
|
|
<li><a href="#Manifest">The Manifest File</a>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
<ol>
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<li><a href="#DeclaringComponents">Declaring components</a></li>
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<li><a href="#DeclaringRequirements">Declaring app requirements</a></li>
|
2011-02-03 18:46:45 -08:00
|
|
|
|
</ol>
|
|
|
|
|
</li>
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<li><a href="#Resources">App Resources</a></li>
|
2010-09-24 16:17:27 -07:00
|
|
|
|
</ol>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>Android apps are written in the Java programming language. The Android SDK tools compile
|
|
|
|
|
your code—along with any data and resource files—into an APK: an <i>Android package</i>,
|
|
|
|
|
which is an archive file with an {@code .apk} suffix. One APK file contains all the contents
|
|
|
|
|
of an Android app and is the file that Android-powered devices use to install the app.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>Once installed on a device, each Android app lives in its own security sandbox: </p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
|
|
|
|
<ul>
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<li>The Android operating system is a multi-user Linux system in which each app is a
|
2011-02-03 18:46:45 -08:00
|
|
|
|
different user.</li>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<li>By default, the system assigns each app a unique Linux user ID (the ID is used only by
|
|
|
|
|
the system and is unknown to the app). The system sets permissions for all the files in an
|
|
|
|
|
app so that only the user ID assigned to that app can access them. </li>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<li>Each process has its own virtual machine (VM), so an app's code runs in isolation from
|
|
|
|
|
other apps.</li>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<li>By default, every app runs in its own Linux process. Android starts the process when any
|
|
|
|
|
of the app's components need to be executed, then shuts down the process when it's no longer
|
|
|
|
|
needed or when the system must recover memory for other apps.</li>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
</ul>
|
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<p>In this way, the Android system implements the <em>principle of least privilege</em>. That is,
|
2013-11-05 18:29:52 -08:00
|
|
|
|
each app, by default, has access only to the components that it requires to do its work and
|
|
|
|
|
no more. This creates a very secure environment in which an app cannot access parts of
|
2011-02-03 18:46:45 -08:00
|
|
|
|
the system for which it is not given permission.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>However, there are ways for an app to share data with other apps and for an
|
|
|
|
|
app to access system services:</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
|
|
|
|
<ul>
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<li>It's possible to arrange for two apps to share the same Linux user ID, in which case
|
|
|
|
|
they are able to access each other's files. To conserve system resources, apps with the
|
2011-02-03 18:46:45 -08:00
|
|
|
|
same user ID can also arrange to run in the same Linux process and share the same VM (the
|
2013-11-05 18:29:52 -08:00
|
|
|
|
apps must also be signed with the same certificate).</li>
|
|
|
|
|
<li>An app can request permission to access device data such as the user's
|
2011-02-03 18:46:45 -08:00
|
|
|
|
contacts, SMS messages, the mountable storage (SD card), camera, Bluetooth, and more. All
|
2013-11-05 18:29:52 -08:00
|
|
|
|
app permissions must be granted by the user at install time.</li>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
</ul>
|
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>That covers the basics regarding how an Android app exists within the system. The rest of
|
2011-02-03 18:46:45 -08:00
|
|
|
|
this document introduces you to:</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
<ul>
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<li>The core framework components that define your app.</li>
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<li>The manifest file in which you declare components and required device features for your
|
2013-11-05 18:29:52 -08:00
|
|
|
|
app.</li>
|
|
|
|
|
<li>Resources that are separate from the app code and allow your app to
|
2011-02-03 18:46:45 -08:00
|
|
|
|
gracefully optimize its behavior for a variety of device configurations.</li>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<h2 id="Components">App Components</h2>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>App components are the essential building blocks of an Android app. Each
|
|
|
|
|
component is a different point through which the system can enter your app. Not all
|
2011-02-03 18:46:45 -08:00
|
|
|
|
components are actual entry points for the user and some depend on each other, but each one exists
|
|
|
|
|
as its own entity and plays a specific role—each one is a unique building block that
|
2013-11-05 18:29:52 -08:00
|
|
|
|
helps define your app's overall behavior.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>There are four different types of app components. Each type serves a distinct purpose
|
2011-02-03 18:46:45 -08:00
|
|
|
|
and has a distinct lifecycle that defines how the component is created and destroyed.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>Here are the four types of app components:</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
|
|
|
|
<dl>
|
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<dt><b>Activities</b></dt>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<dd>An <i>activity</i> represents a single screen with a user interface. For example,
|
2013-11-05 18:29:52 -08:00
|
|
|
|
an email app might have one activity that shows a list of new
|
2011-02-03 18:46:45 -08:00
|
|
|
|
emails, another activity to compose an email, and another activity for reading emails. Although
|
2013-11-05 18:29:52 -08:00
|
|
|
|
the activities work together to form a cohesive user experience in the email app, each one
|
|
|
|
|
is independent of the others. As such, a different app can start any one of these
|
|
|
|
|
activities (if the email app allows it). For example, a camera app can start the
|
|
|
|
|
activity in the email app that composes new mail, in order for the user to share a picture.
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<p>An activity is implemented as a subclass of {@link android.app.Activity} and you can learn more
|
2012-06-21 17:14:39 -07:00
|
|
|
|
about it in the <a href="{@docRoot}guide/components/activities.html">Activities</a>
|
2011-02-03 18:46:45 -08:00
|
|
|
|
developer guide.</p>
|
|
|
|
|
</dd>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<dt><b>Services</b></dt>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<dd>A <i>service</i> is a component that runs in the background to perform long-running
|
|
|
|
|
operations or to perform work for remote processes. A service
|
|
|
|
|
does not provide a user interface. For example, a service might play music in the background while
|
2013-11-05 18:29:52 -08:00
|
|
|
|
the user is in a different app, or it might fetch data over the network without
|
2011-02-03 18:46:45 -08:00
|
|
|
|
blocking user interaction with an activity. Another component, such as an activity, can start the
|
|
|
|
|
service and let it run or bind to it in order to interact with it.
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<p>A service is implemented as a subclass of {@link android.app.Service} and you can learn more
|
2012-06-21 17:14:39 -07:00
|
|
|
|
about it in the <a href="{@docRoot}guide/components/services.html">Services</a> developer
|
2011-02-03 18:46:45 -08:00
|
|
|
|
guide.</p>
|
|
|
|
|
</dd>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<dt><b>Content providers</b></dt>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<dd>A <i>content provider</i> manages a shared set of app data. You can store the data in
|
2011-02-03 18:46:45 -08:00
|
|
|
|
the file system, an SQLite database, on the web, or any other persistent storage location your
|
2013-11-05 18:29:52 -08:00
|
|
|
|
app can access. Through the content provider, other apps can query or even modify
|
2011-02-03 18:46:45 -08:00
|
|
|
|
the data (if the content provider allows it). For example, the Android system provides a content
|
2013-11-05 18:29:52 -08:00
|
|
|
|
provider that manages the user's contact information. As such, any app with the proper
|
2011-02-03 18:46:45 -08:00
|
|
|
|
permissions can query part of the content provider (such as {@link
|
|
|
|
|
android.provider.ContactsContract.Data}) to read and write information about a particular person.
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<p>Content providers are also useful for reading and writing data that is private to your
|
2013-11-05 18:29:52 -08:00
|
|
|
|
app and not shared. For example, the <a
|
|
|
|
|
href="{@docRoot}resources/samples/NotePad/index.html">Note Pad</a> sample app uses a
|
2011-02-03 18:46:45 -08:00
|
|
|
|
content provider to save notes.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<p>A content provider is implemented as a subclass of {@link android.content.ContentProvider}
|
2013-11-05 18:29:52 -08:00
|
|
|
|
and must implement a standard set of APIs that enable other apps to perform
|
2011-02-03 18:46:45 -08:00
|
|
|
|
transactions. For more information, see the <a
|
|
|
|
|
href="{@docRoot}guide/topics/providers/content-providers.html">Content Providers</a> developer
|
|
|
|
|
guide.</p>
|
|
|
|
|
</dd>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<dt><b>Broadcast receivers</b></dt>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<dd>A <i>broadcast receiver</i> is a component that responds to system-wide broadcast
|
|
|
|
|
announcements. Many broadcasts originate from the system—for example, a broadcast announcing
|
|
|
|
|
that the screen has turned off, the battery is low, or a picture was captured.
|
2013-11-05 18:29:52 -08:00
|
|
|
|
Apps can also initiate broadcasts—for example, to let other apps know that
|
2011-02-03 18:46:45 -08:00
|
|
|
|
some data has been downloaded to the device and is available for them to use. Although broadcast
|
|
|
|
|
receivers don't display a user interface, they may <a
|
|
|
|
|
href="{@docRoot}guide/topics/ui/notifiers/notifications.html">create a status bar notification</a>
|
|
|
|
|
to alert the user when a broadcast event occurs. More commonly, though, a broadcast receiver is
|
|
|
|
|
just a "gateway" to other components and is intended to do a very minimal amount of work. For
|
|
|
|
|
instance, it might initiate a service to perform some work based on the event.
|
|
|
|
|
|
|
|
|
|
<p>A broadcast receiver is implemented as a subclass of {@link android.content.BroadcastReceiver}
|
|
|
|
|
and each broadcast is delivered as an {@link android.content.Intent} object. For more information,
|
|
|
|
|
see the {@link android.content.BroadcastReceiver} class.</p>
|
|
|
|
|
</dd>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
</dl>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>A unique aspect of the Android system design is that any app can start another
|
|
|
|
|
app’s component. For example, if you want the user to capture a
|
|
|
|
|
photo with the device camera, there's probably another app that does that and your
|
|
|
|
|
app can use it, instead of developing an activity to capture a photo yourself. You don't
|
|
|
|
|
need to incorporate or even link to the code from the camera app.
|
|
|
|
|
Instead, you can simply start the activity in the camera app that captures a
|
|
|
|
|
photo. When complete, the photo is even returned to your app so you can use it. To the user,
|
|
|
|
|
it seems as if the camera is actually a part of your app.</p>
|
2011-02-03 18:46:45 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>When the system starts a component, it starts the process for that app (if it's not
|
2011-02-03 18:46:45 -08:00
|
|
|
|
already running) and instantiates the classes needed for the component. For example, if your
|
2013-11-05 18:29:52 -08:00
|
|
|
|
app starts the activity in the camera app that captures a photo, that activity
|
|
|
|
|
runs in the process that belongs to the camera app, not in your app's process.
|
|
|
|
|
Therefore, unlike apps on most other systems, Android apps don't have a single entry
|
2011-02-03 18:46:45 -08:00
|
|
|
|
point (there's no {@code main()} function, for example).</p>
|
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>Because the system runs each app in a separate process with file permissions that
|
|
|
|
|
restrict access to other apps, your app cannot directly activate a component from
|
|
|
|
|
another app. The Android system, however, can. So, to activate a component in
|
|
|
|
|
another app, you must deliver a message to the system that specifies your <em>intent</em> to
|
2011-02-03 18:46:45 -08:00
|
|
|
|
start a particular component. The system then activates the component for you.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<h3 id="ActivatingComponents">Activating Components</h3>
|
|
|
|
|
|
|
|
|
|
<p>Three of the four component types—activities, services, and
|
|
|
|
|
broadcast receivers—are activated by an asynchronous message called an <em>intent</em>.
|
|
|
|
|
Intents bind individual components to each other at runtime (you can think of them
|
|
|
|
|
as the messengers that request an action from other components), whether the component belongs
|
2013-11-05 18:29:52 -08:00
|
|
|
|
to your app or another.</p>
|
2011-02-03 18:46:45 -08:00
|
|
|
|
|
|
|
|
|
<p>An intent is created with an {@link android.content.Intent} object, which defines a message to
|
|
|
|
|
activate either a specific component or a specific <em>type</em> of component—an intent
|
|
|
|
|
can be either explicit or implicit, respectively.</p>
|
|
|
|
|
|
|
|
|
|
<p>For activities and services, an intent defines the action to perform (for example, to "view" or
|
|
|
|
|
"send" something) and may specify the URI of the data to act on (among other things that the
|
|
|
|
|
component being started might need to know). For example, an intent might convey a request for an
|
|
|
|
|
activity to show an image or to open a web page. In some cases, you can start an
|
|
|
|
|
activity to receive a result, in which case, the activity also returns
|
|
|
|
|
the result in an {@link android.content.Intent} (for example, you can issue an intent to let
|
|
|
|
|
the user pick a personal contact and have it returned to you—the return intent includes a
|
|
|
|
|
URI pointing to the chosen contact).</p>
|
|
|
|
|
|
|
|
|
|
<p>For broadcast receivers, the intent simply defines the
|
|
|
|
|
announcement being broadcast (for example, a broadcast to indicate the device battery is low
|
|
|
|
|
includes only a known action string that indicates "battery is low").</p>
|
|
|
|
|
|
|
|
|
|
<p>The other component type, content provider, is not activated by intents. Rather, it is
|
|
|
|
|
activated when targeted by a request from a {@link android.content.ContentResolver}. The content
|
|
|
|
|
resolver handles all direct transactions with the content provider so that the component that's
|
|
|
|
|
performing transactions with the provider doesn't need to and instead calls methods on the {@link
|
|
|
|
|
android.content.ContentResolver} object. This leaves a layer of abstraction between the content
|
|
|
|
|
provider and the component requesting information (for security).</p>
|
|
|
|
|
|
2012-02-09 10:09:14 -08:00
|
|
|
|
<p>There are separate methods for activating each type of component:</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
<ul>
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<li>You can start an activity (or give it something new to do) by
|
|
|
|
|
passing an {@link android.content.Intent} to {@link android.content.Context#startActivity
|
|
|
|
|
startActivity()} or {@link android.app.Activity#startActivityForResult startActivityForResult()}
|
|
|
|
|
(when you want the activity to return a result).</li>
|
|
|
|
|
<li>You can start a service (or give new instructions to an ongoing service) by
|
|
|
|
|
passing an {@link android.content.Intent} to {@link android.content.Context#startService
|
|
|
|
|
startService()}. Or you can bind to the service by passing an {@link android.content.Intent} to
|
|
|
|
|
{@link android.content.Context#bindService bindService()}.</li>
|
|
|
|
|
<li>You can initiate a broadcast by passing an {@link android.content.Intent} to methods like
|
|
|
|
|
{@link android.content.Context#sendBroadcast(Intent) sendBroadcast()}, {@link
|
|
|
|
|
android.content.Context#sendOrderedBroadcast(Intent, String) sendOrderedBroadcast()}, or {@link
|
|
|
|
|
android.content.Context#sendStickyBroadcast sendStickyBroadcast()}.</li>
|
|
|
|
|
<li>You can perform a query to a content provider by calling {@link
|
|
|
|
|
android.content.ContentProvider#query query()} on a {@link android.content.ContentResolver}.</li>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
</ul>
|
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<p>For more information about using intents, see the <a
|
2012-06-21 17:14:39 -07:00
|
|
|
|
href="{@docRoot}guide/components/intents-filters.html">Intents and
|
2011-02-03 18:46:45 -08:00
|
|
|
|
Intent Filters</a> document. More information about activating specific components is also provided
|
|
|
|
|
in the following documents: <a
|
2012-06-21 17:14:39 -07:00
|
|
|
|
href="{@docRoot}guide/components/activities.html">Activities</a>, <a
|
|
|
|
|
href="{@docRoot}guide/components/services.html">Services</a>, {@link
|
2011-02-03 18:46:45 -08:00
|
|
|
|
android.content.BroadcastReceiver} and <a
|
|
|
|
|
href="{@docRoot}guide/topics/providers/content-providers.html">Content Providers</a>.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<h2 id="Manifest">The Manifest File</h2>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>Before the Android system can start an app component, the system must know that the
|
|
|
|
|
component exists by reading the app's {@code AndroidManifest.xml} file (the "manifest"
|
|
|
|
|
file). Your app must declare all its components in this file, which must be at the root of
|
|
|
|
|
the app project directory.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>The manifest does a number of things in addition to declaring the app's components,
|
2011-02-03 18:46:45 -08:00
|
|
|
|
such as:</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
<ul>
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<li>Identify any user permissions the app requires, such as Internet access or
|
2011-02-03 18:46:45 -08:00
|
|
|
|
read-access to the user's contacts.</li>
|
2012-06-21 17:14:39 -07:00
|
|
|
|
<li>Declare the minimum <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">API Level</a>
|
2013-11-05 18:29:52 -08:00
|
|
|
|
required by the app, based on which APIs the app uses.</li>
|
|
|
|
|
<li>Declare hardware and software features used or required by the app, such as a camera,
|
2011-02-03 18:46:45 -08:00
|
|
|
|
bluetooth services, or a multitouch screen.</li>
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<li>API libraries the app needs to be linked against (other than the Android framework
|
2011-02-03 18:46:45 -08:00
|
|
|
|
APIs), such as the <a
|
|
|
|
|
href="http://code.google.com/android/add-ons/google-apis/maps-overview.html">Google Maps
|
|
|
|
|
library</a>.</li>
|
|
|
|
|
<li>And more</li>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<h3 id="DeclaringComponents">Declaring components</h3>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>The primary task of the manifest is to inform the system about the app's components. For
|
2011-02-03 18:46:45 -08:00
|
|
|
|
example, a manifest file can declare an activity as follows: </p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<pre>
|
|
|
|
|
<?xml version="1.0" encoding="utf-8"?>
|
|
|
|
|
<manifest ... >
|
|
|
|
|
<application android:icon="@drawable/app_icon.png" ... >
|
|
|
|
|
<activity android:name="com.example.project.ExampleActivity"
|
|
|
|
|
android:label="@string/example_label" ... >
|
|
|
|
|
</activity>
|
|
|
|
|
...
|
|
|
|
|
</application>
|
|
|
|
|
</manifest></pre>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<p>In the <code><a
|
|
|
|
|
href="{@docRoot}guide/topics/manifest/application-element.html"><application></a></code>
|
|
|
|
|
element, the {@code android:icon} attribute points to resources for an icon that identifies the
|
2013-11-05 18:29:52 -08:00
|
|
|
|
app.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<p>In the <code><a
|
|
|
|
|
href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> element,
|
|
|
|
|
the {@code android:name} attribute specifies the fully qualified class name of the {@link
|
|
|
|
|
android.app.Activity} subclass and the {@code android:label} attributes specifies a string
|
|
|
|
|
to use as the user-visible label for the activity.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>You must declare all app components this way:</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
<ul>
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<li><code><a
|
|
|
|
|
href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> elements
|
|
|
|
|
for activities</li>
|
|
|
|
|
<li><code><a
|
|
|
|
|
href="{@docRoot}guide/topics/manifest/service-element.html"><service></a></code> elements for
|
|
|
|
|
services</li>
|
|
|
|
|
<li><code><a
|
|
|
|
|
href="{@docRoot}guide/topics/manifest/receiver-element.html"><receiver></a></code> elements
|
|
|
|
|
for broadcast receivers</li>
|
|
|
|
|
<li><code><a
|
|
|
|
|
href="{@docRoot}guide/topics/manifest/provider-element.html"><provider></a></code> elements
|
|
|
|
|
for content providers</li>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
</ul>
|
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<p>Activities, services, and content providers that you include in your source but do not declare
|
|
|
|
|
in the manifest are not visible to the system and, consequently, can never run. However,
|
|
|
|
|
broadcast
|
|
|
|
|
receivers can be either declared in the manifest or created dynamically in code (as
|
|
|
|
|
{@link android.content.BroadcastReceiver} objects) and registered with the system by calling
|
|
|
|
|
{@link android.content.Context#registerReceiver registerReceiver()}.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>For more about how to structure the manifest file for your app, see <a
|
2011-02-03 18:46:45 -08:00
|
|
|
|
href="{@docRoot}guide/topics/manifest/manifest-intro.html">The AndroidManifest.xml File</a>
|
|
|
|
|
documentation. </p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<h3 id="DeclaringComponentCapabilities">Declaring component capabilities</h3>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<p>As discussed above, in <a href="#ActivatingComponents">Activating Components</a>, you can use an
|
|
|
|
|
{@link android.content.Intent} to start activities, services, and broadcast receivers. You can do so
|
|
|
|
|
by explicitly naming the target component (using the component class name) in the intent. However,
|
2013-11-05 18:29:52 -08:00
|
|
|
|
the real power of intents lies in the concept of <em>implicit intents</em>. An implicit intent
|
2014-05-30 14:34:33 -07:00
|
|
|
|
simply describes the type of action to perform (and, optionally, the data upon which you’d like to
|
|
|
|
|
perform the action) and allows the system to find a component on the device that can perform the
|
2011-02-03 18:46:45 -08:00
|
|
|
|
action and start it. If there are multiple components that can perform the action described by the
|
|
|
|
|
intent, then the user selects which one to use.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<p>The way the system identifies the components that can respond to an intent is by comparing the
|
2013-11-05 18:29:52 -08:00
|
|
|
|
intent received to the <i>intent filters</i> provided in the manifest file of other apps on
|
2011-02-03 18:46:45 -08:00
|
|
|
|
the device.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>When you declare an activity in your app's manifest, you can optionally include
|
|
|
|
|
intent filters that declare the capabilities of the activity so it can respond to intents
|
|
|
|
|
from other apps. You can declare an intent filter for your component by
|
2011-02-03 18:46:45 -08:00
|
|
|
|
adding an <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code
|
|
|
|
|
<intent-filter>}</a> element as a child of the component's declaration element.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>For example, if you've built an email app with an activity for composing a new email, you can
|
|
|
|
|
declare an intent filter to respond to "send" intents (in order to send a new email) like this:</p>
|
|
|
|
|
<pre>
|
|
|
|
|
<manifest ... >
|
|
|
|
|
...
|
|
|
|
|
<application ... >
|
|
|
|
|
<activity android:name="com.example.project.ComposeEmailActivity">
|
|
|
|
|
<intent-filter>
|
|
|
|
|
<action android:name="android.intent.action.SEND" />
|
|
|
|
|
<data android:type="*/*" />
|
|
|
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
|
|
|
</intent-filter>
|
|
|
|
|
</activity>
|
|
|
|
|
</application>
|
|
|
|
|
</manifest>
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>Then, if another app creates an intent with the {@link
|
|
|
|
|
android.content.Intent#ACTION_SEND} action and pass it to {@link android.app.Activity#startActivity
|
|
|
|
|
startActivity()}, the system may start your activity so the user can draft and send an
|
|
|
|
|
email.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<p>For more about creating intent filters, see the <a
|
2012-06-21 17:14:39 -07:00
|
|
|
|
href="{@docRoot}guide/components/intents-filters.html">Intents and Intent Filters</a> document.
|
2009-03-03 19:31:44 -08:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<h3 id="DeclaringRequirements">Declaring app requirements</h3>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<p>There are a variety of devices powered by Android and not all of them provide the
|
2013-11-05 18:29:52 -08:00
|
|
|
|
same features and capabilities. In order to prevent your app from being installed on devices
|
|
|
|
|
that lack features needed by your app, it's important that you clearly define a profile for
|
|
|
|
|
the types of devices your app supports by declaring device and software requirements in your
|
2011-02-03 18:46:45 -08:00
|
|
|
|
manifest file. Most of these declarations are informational only and the system does not read
|
2012-01-27 17:56:49 -08:00
|
|
|
|
them, but external services such as Google Play do read them in order to provide filtering
|
2013-11-05 18:29:52 -08:00
|
|
|
|
for users when they search for apps from their device.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>For example, if your app requires a camera and uses APIs introduced in Android 2.1 (<a
|
|
|
|
|
href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">API Level</a> 7),
|
|
|
|
|
you should declare these as requirements in your manifest file like this:</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<pre>
|
|
|
|
|
<manifest ... >
|
|
|
|
|
<uses-feature android:name="android.hardware.camera.any"
|
|
|
|
|
android:required="true" />
|
|
|
|
|
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" />
|
|
|
|
|
...
|
|
|
|
|
</manifest>
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>Now, devices that do <em>not</em> have a camera and have an
|
|
|
|
|
Android version <em>lower</em> than 2.1 cannot install your app from Google Play.</p>
|
|
|
|
|
|
|
|
|
|
<p>However, you can also declare that your app uses the camera, but does not
|
|
|
|
|
<em>require</em> it. In that case, your app must set the <a href=
|
|
|
|
|
"{@docRoot}guide/topics/manifest/uses-feature-element.html#required">{@code required}</a>
|
|
|
|
|
attribute to {@code "false"} and check at runtime whether
|
|
|
|
|
the device has a camera and disable any camera features as appropriate.</p>
|
|
|
|
|
|
|
|
|
|
<p>More information about how you can manage your app's compatibility with different devices
|
|
|
|
|
is provided in the <a href="{@docRoot}guide/practices/compatibility.html">Device Compatibility</a>
|
2011-02-03 18:46:45 -08:00
|
|
|
|
document.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<h2 id="Resources">App Resources</h2>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>An Android app is composed of more than just code—it requires resources that are
|
2011-02-03 18:46:45 -08:00
|
|
|
|
separate from the source code, such as images, audio files, and anything relating to the visual
|
2013-11-05 18:29:52 -08:00
|
|
|
|
presentation of the app. For example, you should define animations, menus, styles, colors,
|
|
|
|
|
and the layout of activity user interfaces with XML files. Using app resources makes it easy
|
|
|
|
|
to update various characteristics of your app without modifying code and—by providing
|
|
|
|
|
sets of alternative resources—enables you to optimize your app for a variety of
|
2011-02-03 18:46:45 -08:00
|
|
|
|
device configurations (such as different languages and screen sizes).</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<p>For every resource that you include in your Android project, the SDK build tools define a unique
|
2013-11-05 18:29:52 -08:00
|
|
|
|
integer ID, which you can use to reference the resource from your app code or from
|
|
|
|
|
other resources defined in XML. For example, if your app contains an image file named {@code
|
2011-02-03 18:46:45 -08:00
|
|
|
|
logo.png} (saved in the {@code res/drawable/} directory), the SDK tools generate a resource ID
|
|
|
|
|
named {@code R.drawable.logo}, which you can use to reference the image and insert it in your
|
|
|
|
|
user interface.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<p>One of the most important aspects of providing resources separate from your source code
|
|
|
|
|
is the ability for you to provide alternative resources for different device
|
|
|
|
|
configurations. For example, by defining UI strings in XML, you can translate the strings into other
|
|
|
|
|
languages and save those strings in separate files. Then, based on a language <em>qualifier</em>
|
|
|
|
|
that you append to the resource directory's name (such as {@code res/values-fr/} for French string
|
|
|
|
|
values) and the user's language setting, the Android system applies the appropriate language strings
|
|
|
|
|
to your UI.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2011-02-03 18:46:45 -08:00
|
|
|
|
<p>Android supports many different <em>qualifiers</em> for your alternative resources. The
|
|
|
|
|
qualifier is a short string that you include in the name of your resource directories in order to
|
|
|
|
|
define the device configuration for which those resources should be used. As another
|
|
|
|
|
example, you should often create different layouts for your activities, depending on the
|
|
|
|
|
device's screen orientation and size. For example, when the device screen is in portrait
|
|
|
|
|
orientation (tall), you might want a layout with buttons to be vertical, but when the screen is in
|
|
|
|
|
landscape orientation (wide), the buttons should be aligned horizontally. To change the layout
|
|
|
|
|
depending on the orientation, you can define two different layouts and apply the appropriate
|
|
|
|
|
qualifier to each layout's directory name. Then, the system automatically applies the appropriate
|
|
|
|
|
layout depending on the current device orientation.</p>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|
2013-11-05 18:29:52 -08:00
|
|
|
|
<p>For more about the different kinds of resources you can include in your application and how to
|
|
|
|
|
create alternative resources for different device configurations, read <a href=
|
|
|
|
|
"{@docRoot}guide/topics/resources/providing-resources.html">Providing Resources</a>.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="next-docs">
|
|
|
|
|
<div class="col-6">
|
|
|
|
|
<h2 class="norule">Continue reading about:</h2>
|
|
|
|
|
<dl>
|
|
|
|
|
<dt><a href="{@docRoot}guide/components/intents-filters.html">Intents and Intent Filters</a>
|
|
|
|
|
</dt>
|
|
|
|
|
<dd>Information about how to use the {@link android.content.Intent} APIs to
|
|
|
|
|
activate app components, such as activities and services, and how to make your app components
|
|
|
|
|
available for use by other apps.</dd>
|
|
|
|
|
<dt><a href="{@docRoot}guide/components/activities.html">Activities</a></dt>
|
|
|
|
|
<dd>Information about how to create an instance of the {@link android.app.Activity} class,
|
|
|
|
|
which provides a distinct screen in your application with a user interface.</dd>
|
|
|
|
|
<dt><a
|
|
|
|
|
href="{@docRoot}guide/topics/resources/providing-resources.html">Providing Resources</a></dt>
|
|
|
|
|
<dd>Information about how Android apps are structured to separate app resources from the
|
|
|
|
|
app code, including how you can provide alternative resources for specific device
|
|
|
|
|
configurations.
|
|
|
|
|
</dd>
|
|
|
|
|
</dl>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="col-6">
|
|
|
|
|
<h2 class="norule">You might also be interested in:</h2>
|
|
|
|
|
<dl>
|
|
|
|
|
<dt><a href="{@docRoot}guide/practices/compatibility.html"
|
|
|
|
|
>Device Compatibility</a></dt>
|
|
|
|
|
<dd>Information about Android works on different types of devices and an introduction
|
|
|
|
|
to how you can optimize your app for each device or restrict your app's availability
|
|
|
|
|
to different devices.</dd>
|
|
|
|
|
<dt><a href="{@docRoot}guide/topics/security/permissions.html"
|
|
|
|
|
>System Permissions</a></dt>
|
|
|
|
|
<dd>Information about how Android restricts app access to certain APIs with a permission
|
|
|
|
|
system that requires the user's consent for your app to use those APIs.</dd>
|
|
|
|
|
</dl>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2009-03-03 19:31:44 -08:00
|
|
|
|
|