Intent
public
class
Intent
extends Object
implements
Cloneable,
Parcelable
java.lang.Object | |
↳ | android.content.Intent |
An intent is an abstract description of an operation to be performed. It
can be used with startActivity
to
launch an Activity
,
broadcastIntent
to
send it to any interested BroadcastReceiver
components,
and Context.startService(Intent)
or
Context.bindService(Intent, BindServiceFlags, Executor, ServiceConnection)
to communicate with a
background Service
.
An Intent provides a facility for performing late runtime binding between the code in different applications. Its most significant use is in the launching of activities, where it can be thought of as the glue between activities. It is basically a passive data structure holding an abstract description of an action to be performed.
Developer Guides
For information about how to create and resolve intents, read the Intents and Intent Filters developer guide.
Intent Structure
The primary pieces of information in an intent are:
-
action -- The general action to be performed, such as
ACTION_VIEW
,ACTION_EDIT
,ACTION_MAIN
, etc. -
data -- The data to operate on, such as a person record in the contacts database, expressed as a
Uri
.
Some examples of action/data pairs are:
-
ACTION_VIEW
content://contacts/people/1 -- Display information about the person whose identifier is "1". -
ACTION_DIAL
content://contacts/people/1 -- Display the phone dialer with the person filled in. -
ACTION_VIEW
tel:123 -- Display the phone dialer with the given number filled in. Note how the VIEW action does what is considered the most reasonable thing for a particular URI. -
ACTION_DIAL
tel:123 -- Display the phone dialer with the given number filled in. -
ACTION_EDIT
content://contacts/people/1 -- Edit information about the person whose identifier is "1". -
ACTION_VIEW
content://contacts/people/ -- Display a list of people, which the user can browse through. This example is a typical top-level entry into the Contacts application, showing you the list of people. Selecting a particular person to view would result in a new intent {ACTION_VIEW
content://contacts/people/N } being used to start an activity to display that person.
In addition to these primary attributes, there are a number of secondary attributes that you can also include with an intent:
-
category -- Gives additional information about the action to execute. For example,
CATEGORY_LAUNCHER
means it should appear in the Launcher as a top-level application, whileCATEGORY_ALTERNATIVE
means it should be included in a list of alternative actions the user can perform on a piece of data. -
type -- Specifies an explicit type (a MIME type) of the intent data. Normally the type is inferred from the data itself. By setting this attribute, you disable that evaluation and force an explicit type.
-
component -- Specifies an explicit name of a component class to use for the intent. Normally this is determined by looking at the other information in the intent (the action, data/type, and categories) and matching that with a component that can handle it. If this attribute is set then none of the evaluation is performed, and this component is used exactly as is. By specifying this attribute, all of the other Intent attributes become optional.
-
extras -- This is a
Bundle
of any additional information. This can be used to provide extended information to the component. For example, if we have a action to send an e-mail message, we could also include extra pieces of data here to supply a subject, body, etc.
Here are some examples of other operations you can specify as intents using these additional parameters:
-
ACTION_MAIN
with categoryCATEGORY_HOME
-- Launch the home screen. -
ACTION_GET_CONTENT
with MIME typevnd.android.cursor.item/phone
-- Display the list of people's phone numbers, allowing the user to browse through them and pick one and return it to the parent activity. -
ACTION_GET_CONTENT
with MIME type */* and categoryCATEGORY_OPENABLE
-- Display all pickers for data that can be opened withContentResolver.openInputStream()
, allowing the user to pick one of them and then some data inside of it and returning the resulting URI to the caller. This can be used, for example, in an e-mail application to allow the user to pick some data to include as an attachment.
There are a variety of standard Intent action and category constants
defined in the Intent class, but applications can also define their own.
These strings use Java-style scoping, to ensure they are unique -- for
example, the standard ACTION_VIEW
is called
"android.intent.action.VIEW".
Put together, the set of actions, data types, categories, and extra data defines a language for the system allowing for the expression of phrases such as "call john smith's cell". As applications are added to the system, they can extend this language by adding new actions, types, and categories, or they can modify the behavior of existing phrases by supplying their own activities that handle them.
Intent Resolution
There are two primary forms of intents you will use.
-
Explicit Intents have specified a component (via
setComponent(ComponentName)
orsetClass(Context, Class)
), which provides the exact class to be run. Often these will not include any other information, simply being a way for an application to launch various internal activities it has as the user interacts with the application. -
Implicit Intents have not specified a component; instead, they must include enough information for the system to determine which of the available components is best to run for that intent.
When using implicit intents, given such an arbitrary intent we need to
know what to do with it. This is handled by the process of Intent
resolution, which maps an Intent to an Activity
,
BroadcastReceiver
, or Service
(or sometimes two or
more activities/receivers) that can handle it.
The intent resolution mechanism basically revolves around matching an
Intent against all of the <intent-filter> descriptions in the
installed application packages. (Plus, in the case of broadcasts, any BroadcastReceiver
objects explicitly registered with Context.registerReceiver
.) More
details on this can be found in the documentation on the IntentFilter
class.
There are three pieces of information in the Intent that are used for
resolution: the action, type, and category. Using this information, a query
is done on the PackageManager
for a component that can handle the
intent. The appropriate component is determined based on the intent
information supplied in the AndroidManifest.xml
file as
follows:
-
The action, if given, must be listed by the component as one it handles.
-
The type is retrieved from the Intent's data, if not already supplied in the Intent. Like the action, if a type is included in the intent (either explicitly or implicitly in its data), then this must be listed by the component as one it handles.
- For data that is not a
content:
URI and where no explicit type is included in the Intent, instead the scheme of the intent data (such ashttp:
ormailto:
) is considered. Again like the action, if we are matching a scheme it must be listed by the component as one it can handle. -
The categories, if supplied, must all be listed by the activity as categories it handles. That is, if you include the categories
CATEGORY_LAUNCHER
andCATEGORY_ALTERNATIVE
, then you will only resolve to components with an intent that lists both of those categories. Activities will very often need to support theCATEGORY_DEFAULT
so that they can be found byContext.startActivity()
.
For example, consider the Note Pad sample application that allows a user to browse through a list of notes data and view details about individual items. Text in italics indicates places where you would replace a name with one specific to your own package.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.notepad"> <application android:icon="@drawable/app_notes" android:label="@string/app_name"> <provider class=".NotePadProvider" android:authorities="com.google.provider.NotePad" /> <activity class=".NotesList" android:label="@string/title_notes_list"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.EDIT" /> <action android:name="android.intent.action.PICK" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.GET_CONTENT" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.item/vnd.google.note" /> </intent-filter> </activity> <activity class=".NoteEditor" android:label="@string/title_note"> <intent-filter android:label="@string/resolve_edit"> <action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.EDIT" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.item/vnd.google.note" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.INSERT" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" /> </intent-filter> </activity> <activity class=".TitleEditor" android:label="@string/title_edit_title" android:theme="@android:style/Theme.Dialog"> <intent-filter android:label="@string/resolve_title"> <action android:name="com.android.notepad.action.EDIT_TITLE" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.ALTERNATIVE" /> <category android:name="android.intent.category.SELECTED_ALTERNATIVE" /> <data android:mimeType="vnd.android.cursor.item/vnd.google.note" /> </intent-filter> </activity> </application> </manifest>
The first activity,
com.android.notepad.NotesList
, serves as our main
entry into the app. It can do three things as described by its three intent
templates:
<intent-filter> <action android:name="
android.intent.action.MAIN
" /> <category android:name="android.intent.category.LAUNCHER
" /> </intent-filter>This provides a top-level entry into the NotePad application: the standard MAIN action is a main entry point (not requiring any other information in the Intent), and the LAUNCHER category says that this entry point should be listed in the application launcher.
<intent-filter> <action android:name="
android.intent.action.VIEW
" /> <action android:name="android.intent.action.EDIT
" /> <action android:name="android.intent.action.PICK
" /> <category android:name="android.intent.category.DEFAULT
" /> <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" /> </intent-filter>This declares the things that the activity can do on a directory of notes. The type being supported is given with the <type> tag, where
vnd.android.cursor.dir/vnd.google.note
is a URI from which a Cursor of zero or more items (vnd.android.cursor.dir
) can be retrieved which holds our note pad data (vnd.google.note
). The activity allows the user to view or edit the directory of data (via the VIEW and EDIT actions), or to pick a particular note and return it to the caller (via the PICK action). Note also the DEFAULT category supplied here: this is required for theContext.startActivity
method to resolve your activity when its component name is not explicitly specified.<intent-filter> <action android:name="
android.intent.action.GET_CONTENT
" /> <category android:name="android.intent.category.DEFAULT
" /> <data android:mimeType="vnd.android.cursor.item/vnd.google.note" /> </intent-filter>This filter describes the ability to return to the caller a note selected by the user without needing to know where it came from. The data type
vnd.android.cursor.item/vnd.google.note
is a URI from which a Cursor of exactly one (vnd.android.cursor.item
) item can be retrieved which contains our note pad data (vnd.google.note
). The GET_CONTENT action is similar to the PICK action, where the activity will return to its caller a piece of data selected by the user. Here, however, the caller specifies the type of data they desire instead of the type of data the user will be picking from.
Given these capabilities, the following intents will resolve to the NotesList activity:
-
{ action=android.app.action.MAIN } matches all of the activities that can be used as top-level entry points into an application.
-
{ action=android.app.action.MAIN, category=android.app.category.LAUNCHER } is the actual intent used by the Launcher to populate its top-level list.
-
{ action=android.intent.action.VIEW data=content://com.google.provider.NotePad/notes } displays a list of all the notes under "content://com.google.provider.NotePad/notes", which the user can browse through and see the details on.
-
{ action=android.app.action.PICK data=content://com.google.provider.NotePad/notes } provides a list of the notes under "content://com.google.provider.NotePad/notes", from which the user can pick a note whose data URL is returned back to the caller.
-
{ action=android.app.action.GET_CONTENT type=vnd.android.cursor.item/vnd.google.note } is similar to the pick action, but allows the caller to specify the kind of data they want back so that the system can find the appropriate activity to pick something of that data type.
The second activity,
com.android.notepad.NoteEditor
, shows the user a single
note entry and allows them to edit it. It can do two things as described
by its two intent templates:
<intent-filter android:label="@string/resolve_edit"> <action android:name="
android.intent.action.VIEW
" /> <action android:name="android.intent.action.EDIT
" /> <category android:name="android.intent.category.DEFAULT
" /> <data android:mimeType="vnd.android.cursor.item/vnd.google.note" /> </intent-filter>The first, primary, purpose of this activity is to let the user interact with a single note, as decribed by the MIME type
vnd.android.cursor.item/vnd.google.note
. The activity can either VIEW a note or allow the user to EDIT it. Again we support the DEFAULT category to allow the activity to be launched without explicitly specifying its component.<intent-filter> <action android:name="
android.intent.action.INSERT
" /> <category android:name="android.intent.category.DEFAULT
" /> <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" /> </intent-filter>The secondary use of this activity is to insert a new note entry into an existing directory of notes. This is used when the user creates a new note: the INSERT action is executed on the directory of notes, causing this activity to run and have the user create the new note data which it then adds to the content provider.
Given these capabilities, the following intents will resolve to the NoteEditor activity:
-
{ action=android.intent.action.VIEW data=content://com.google.provider.NotePad/notes/{ID} } shows the user the content of note {ID}.
-
{ action=android.app.action.EDIT data=content://com.google.provider.NotePad/notes/{ID} } allows the user to edit the content of note {ID}.
-
{ action=android.app.action.INSERT data=content://com.google.provider.NotePad/notes } creates a new, empty note in the notes list at "content://com.google.provider.NotePad/notes" and allows the user to edit it. If they keep their changes, the URI of the newly created note is returned to the caller.
The last activity,
com.android.notepad.TitleEditor
, allows the user to
edit the title of a note. This could be implemented as a class that the
application directly invokes (by explicitly setting its component in
the Intent), but here we show a way you can publish alternative
operations on existing data:
<intent-filter android:label="@string/resolve_title"> <action android:name="com.android.notepad.action.EDIT_TITLE" /> <category android:name="android.intent.category.DEFAULT
" /> <category android:name="android.intent.category.ALTERNATIVE
" /> <category android:name="android.intent.category.SELECTED_ALTERNATIVE
" /> <data android:mimeType="vnd.android.cursor.item/vnd.google.note" /> </intent-filter>
In the single intent template here, we
have created our own private action called
com.android.notepad.action.EDIT_TITLE
which means to
edit the title of a note. It must be invoked on a specific note
(data type vnd.android.cursor.item/vnd.google.note
) like the previous
view and edit actions, but here displays and edits the title contained
in the note data.
In addition to supporting the default category as usual, our title editor
also supports two other standard categories: ALTERNATIVE and
SELECTED_ALTERNATIVE. Implementing
these categories allows others to find the special action it provides
without directly knowing about it, through the
PackageManager.queryIntentActivityOptions(ComponentName, Intent, Intent, int)
method, or
more often to build dynamic menu items with
Menu.addIntentOptions(int, int, int, ComponentName, Intent, Intent, int, MenuItem)
. Note that in the intent
template here was also supply an explicit name for the template
(via android:label="@string/resolve_title"
) to better control
what the user sees when presented with this activity as an alternative
action to the data they are viewing.
Given these capabilities, the following intent will resolve to the TitleEditor activity:
-
{ action=com.android.notepad.action.EDIT_TITLE data=content://com.google.provider.NotePad/notes/{ID} } displays and allows the user to edit the title associated with note {ID}.
Standard Activity Actions
These are the current standard actions that Intent defines for launching
activities (usually through Context.startActivity
. The most
important, and by far most frequently used, are ACTION_MAIN
and
ACTION_EDIT
.
-
ACTION_MAIN
-
ACTION_VIEW
-
ACTION_ATTACH_DATA
-
ACTION_EDIT
-
ACTION_PICK
-
ACTION_CHOOSER
-
ACTION_GET_CONTENT
-
ACTION_DIAL
-
ACTION_CALL
-
ACTION_SEND
-
ACTION_SENDTO
-
ACTION_ANSWER
-
ACTION_INSERT
-
ACTION_DELETE
-
ACTION_RUN
-
ACTION_SYNC
-
ACTION_PICK_ACTIVITY
-
ACTION_SEARCH
-
ACTION_WEB_SEARCH
-
ACTION_FACTORY_TEST
Standard Broadcast Actions
These are the current standard actions that Intent defines for receiving
broadcasts (usually through Context.registerReceiver
or a
<receiver> tag in a manifest).
-
ACTION_TIME_TICK
-
ACTION_TIME_CHANGED
-
ACTION_TIMEZONE_CHANGED
-
ACTION_BOOT_COMPLETED
-
ACTION_PACKAGE_ADDED
-
ACTION_PACKAGE_CHANGED
-
ACTION_PACKAGE_REMOVED
-
ACTION_PACKAGE_RESTARTED
-
ACTION_PACKAGE_DATA_CLEARED
-
ACTION_PACKAGES_SUSPENDED
-
ACTION_PACKAGES_UNSUSPENDED
-
ACTION_UID_REMOVED
-
ACTION_BATTERY_CHANGED
-
ACTION_POWER_CONNECTED
-
ACTION_POWER_DISCONNECTED
-
ACTION_SHUTDOWN
Note: If your app targets Android 11
(API level 30) or higher, registering broadcast such as
ACTION_PACKAGES_SUSPENDED
that includes package details in the
extras receives a filtered list of apps or nothing. Learn more about how to
manage package visibility.
Standard Categories
These are the current standard categories that can be used to further
clarify an Intent via addCategory(String)
.
-
CATEGORY_DEFAULT
-
CATEGORY_BROWSABLE
-
CATEGORY_TAB
-
CATEGORY_ALTERNATIVE
-
CATEGORY_SELECTED_ALTERNATIVE
-
CATEGORY_LAUNCHER
-
CATEGORY_INFO
-
CATEGORY_HOME
-
CATEGORY_PREFERENCE
-
CATEGORY_TEST
-
CATEGORY_CAR_DOCK
-
CATEGORY_DESK_DOCK
-
CATEGORY_LE_DESK_DOCK
-
CATEGORY_HE_DESK_DOCK
-
CATEGORY_CAR_MODE
-
CATEGORY_APP_MARKET
-
CATEGORY_VR_HOME
Standard Extra Data
These are the current standard fields that can be used as extra data via
putExtra(String, Bundle)
.
-
EXTRA_ALARM_COUNT
-
EXTRA_BCC
-
EXTRA_CC
-
EXTRA_CHANGED_COMPONENT_NAME
-
EXTRA_DATA_REMOVED
-
EXTRA_DOCK_STATE
-
EXTRA_DOCK_STATE_HE_DESK
-
EXTRA_DOCK_STATE_LE_DESK
-
EXTRA_DOCK_STATE_CAR
-
EXTRA_DOCK_STATE_DESK
-
EXTRA_DOCK_STATE_UNDOCKED
-
EXTRA_DONT_KILL_APP
-
EXTRA_EMAIL
-
EXTRA_INITIAL_INTENTS
-
EXTRA_INTENT
-
EXTRA_KEY_EVENT
-
EXTRA_ORIGINATING_URI
-
EXTRA_PHONE_NUMBER
-
EXTRA_REFERRER
-
EXTRA_REMOTE_INTENT_TOKEN
-
EXTRA_REPLACING
-
EXTRA_SHORTCUT_ICON
-
EXTRA_SHORTCUT_ICON_RESOURCE
-
EXTRA_SHORTCUT_INTENT
-
EXTRA_STREAM
-
EXTRA_SHORTCUT_NAME
-
EXTRA_SUBJECT
-
EXTRA_TEMPLATE
-
EXTRA_TEXT
-
EXTRA_TITLE
-
EXTRA_UID
-
EXTRA_USER_INITIATED
Flags
These are the possible flags that can be used in the Intent via
setFlags(int)
and addFlags(int)
. See setFlags(int)
for a list
of all possible flags.
Summary
Nested classes | |
---|---|
class |
Intent.FilterComparison
Wrapper class holding an Intent and implementing comparisons on it for the purpose of filtering. |
class |
Intent.ShortcutIconResource
Represents a shortcut/live folder icon resource. |
Constants | |
---|---|
String |
ACTION_AIRPLANE_MODE_CHANGED
Broadcast Action: The user has switched the phone into or out of Airplane Mode. |
String |
ACTION_ALL_APPS
Activity Action: List all available applications. |
String |
ACTION_ANSWER
Activity Action: Handle an incoming phone call. |
String |
ACTION_APPLICATION_LOCALE_CHANGED
Broadcast Action: Locale of a particular app has changed. |
String |
ACTION_APPLICATION_PREFERENCES
An activity that provides a user interface for adjusting application preferences. |
String |
ACTION_APPLICATION_RESTRICTIONS_CHANGED
Broadcast Action: Sent after application restrictions are changed. |
String |
ACTION_APP_ERROR
Activity Action: The user pressed the "Report" button in the crash/ANR dialog. |
String |
ACTION_ASSIST
Activity Action: Perform assist action. |
String |
ACTION_ATTACH_DATA
Used to indicate that some piece of data should be attached to some other place. |
String |
ACTION_AUTO_REVOKE_PERMISSIONS
Activity action: Launch UI to manage auto-revoke state. |
String |
ACTION_BATTERY_CHANGED
Broadcast Action: This is a sticky broadcast containing the charging state, level, and other information about the battery. |
String |
ACTION_BATTERY_LOW
Broadcast Action: Indicates low battery condition on the device. |
String |
ACTION_BATTERY_OKAY
Broadcast Action: Indicates the battery is now okay after being low. |
String |
ACTION_BOOT_COMPLETED
Broadcast Action: This is broadcast once, after the user has finished booting. |
String |
ACTION_BUG_REPORT
Activity Action: Show activity for reporting a bug. |
String |
ACTION_CALL
Activity Action: Perform a call to someone specified by the data. |
String |
ACTION_CALL_BUTTON
Activity Action: The user pressed the "call" button to go to the dialer or other appropriate UI for placing a call. |
String |
ACTION_CAMERA_BUTTON
Broadcast Action: The "Camera Button" was pressed. |
String |
ACTION_CARRIER_SETUP
Activity Action: Main entry point for carrier setup apps. |
String |
ACTION_CHOOSER
Activity Action: Display an activity chooser, allowing the user to pick what they want to before proceeding. |
String |
ACTION_CLOSE_SYSTEM_DIALOGS
This constant was deprecated
in API level 31.
This intent is deprecated for third-party applications starting from Android
|
String |
ACTION_CONFIGURATION_CHANGED
Broadcast Action: The current device |
String |
ACTION_CREATE_DOCUMENT
Activity Action: Allow the user to create a new document. |
String |
ACTION_CREATE_NOTE
Activity Action: Starts a note-taking activity that can be used to create a note. |
String |
ACTION_CREATE_REMINDER
Activity Action: Creates a reminder. |
String |
ACTION_CREATE_SHORTCUT
Activity Action: Creates a shortcut. |
String |
ACTION_DATE_CHANGED
Broadcast Action: The date has changed. |
String |
ACTION_DEFAULT
A synonym for |
String |
ACTION_DEFINE
Activity Action: Define the meaning of the selected word(s). |
String |
ACTION_DELETE
Activity Action: Delete the given data from its container. |
String |
ACTION_DEVICE_STORAGE_LOW
This constant was deprecated
in API level 26.
if your app targets |
String |
ACTION_DEVICE_STORAGE_OK
This constant was deprecated
in API level 26.
if your app targets |
String |
ACTION_DIAL
Activity Action: Dial a number as specified by the data. |
String |
ACTION_DOCK_EVENT
Broadcast Action: A sticky broadcast for changes in the physical docking state of the device. |
String |
ACTION_DREAMING_STARTED
Broadcast Action: Sent after the system starts dreaming. |
String |
ACTION_DREAMING_STOPPED
Broadcast Action: Sent after the system stops dreaming. |
String |
ACTION_EDIT
Activity Action: Provide explicit editable access to the given data. |
String |
ACTION_EXTERNAL_APPLICATIONS_AVAILABLE
Broadcast Action: Resources for a set of packages (which were previously unavailable) are currently available since the media on which they exist is available. |
String |
ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE
Broadcast Action: Resources for a set of packages are currently unavailable since the media on which they exist is unavailable. |
|