This document describes how to use intents in Android. It provides an overview of intents, the difference between implicit and explicit intents, how to transfer data between activities using intents, and how to register an application to respond to implicit intents using intent filters. It includes code examples for starting implicit intents to open URLs, make phone calls, and transfer data between activities using explicit intents.
Measures of Dispersion and Variability: Range, QD, AD and SD
Using intents in android
1. Using Intents in Android
This article describes how to use intents in Android. It is based on Eclipse 3.7, Java 1.6 and Android 2.3.3 (Gingerbread).
Tabl eof Contents
1. Android Intents
1.1. Overview
1.2. Implicit vrsExplicit Intents
1.3. Getting theIntent datain the called Activity
1.4. Intent Filter
1.5. Intentsas event triggers
1.6. Starting Activitiesand Sub-Activities
1.7. Android Basics
2. Implicit Intents- Opening an URL
3. Explicit intentsand data transfer betweenactivities
4. Registering via Intentfilter
5. Notification Manager
5.1. Notification Manager
5.2. Example
6. Finding out ifan intent isavailable
7. Thankyou
8. Questionsand Discussion
9. Links and Literature
9.1. Source Code
9.2. Android Resources
9.3. vogellaResources
1. Android Intents
1.1. Overview
Objects of type "android.content.Intent"are used to send asynchronous messages within your application or between applications. Intents allow
to send or receive datafrom and to other activities or services. They also allow to broadcast that a certain event has occurred.
Intents are a powerful concept as they allow the creation of loosely coupled applications. Intents can be u sed to communicate between any
installed application component on the device.
An Intent object can contain information for the receiving component. For example ifyour application calls via an Intent a browser it maysend
the URL to the browser component. An Intent also contain information for the Android system so that the Android system can determine which
com ponent should handle the request.
1.2. Implicit vrsExplicit Intents
Android su pports explicit intents and implicit intents. Explicit intent names the component, e.g. the Java class which should be called.
Im plicit intents asked the system to perform a service w ithout tellingthe system whichJava class should do this service. In constructing an
im plicit Intent you specify the action which should be performed and optionally an URI whichshould be used for this action. For example you
cou ld tell the system that you want to view (action) a webpage (URI). By startingan intent for this data the system would try to find an
application which is registered for thisevent, e.g. a browwer. You canadd more datato the Intent by adding "extras"to the Intent. These are
key/value pairs.
1.3. Getting the Intent data in the called Activity
To get the Intent information in the called Activity u se the method getIntent(). If the Activity was called via an implicit Intent you canreceive
the data and url from this Intent via getAction(), getData() and getExtras().
1.4. Intent Filter
2. The Android system will determine suitable applications for an implicit intentand if several applicationsexists offer the user the choice toopen
one. The determination is based on intent filters, e.g. the class "android.content.IntentFilter". Intent filters are typically defined via the
"AndroidManifest.xml"file.
To react to a certain implicit intent an application component must register itself via an IntentFilter in the "AndroidManifest.xml"to this event.
If a com ponent does not define intent filters it can only be called by explicit intents.
1.5. Intentsasevent triggers
Intents canalso be used to broadcast messages into the Android system. An Android application can registerBroadcast Receivers to these
ev ents and react accordingly. The Android system also u ses Intents to broadcast system events. Yourapplication can also register to these
sy stem events, e.g. a new email has arrived, system boot is complete or a phone call is received and react accordingly.
1.6. Starting Activitiesand Sub-Activities
To start an activity u se the method startActivity(Intent) if you do not need a returnvalue from the called activity.
If y ou need some information from the called activity u se the method startActivityForResult(). Once the called Activity is finished the method
onActivityResult() in the calling activity w ill be called. If you use startActivityForResult() then the activity which is started i s considered a "Su b-
Activity".
1.7. Android Basics
The followingassumes that you have already basic knowledge in Android development . Please check the Android development tutorial to learn
the basics.
2. Implicit Intents - Opening an URL
The followingcreatesan examle project for calling several implicit intent. The Android system is asked to display a URI and chooses the
corresponding application for the right URI. Create a new Android application "de.vogella.android.inten t.implicit"w ith the Activity
"CallIntents". Create the following view layout.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Call
browser" android:onClick="callIntent"></Button>
<Button android:id="@+id/Button02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Call
Someone" android:width="100px" android:onClick="callIntent"></Button>
<Button android:id="@+id/Button03" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Dial"
android:width="100px" android:onClick="callIntent"></Button>
<Button android:id="@+id/Button04" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Show
Map" android:width="100px" android:onClick="callIntent"></Button>
3. <Button android:id="@+id/Button05" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Search
on Map" android:width="100px" android:onClick="callIntent"></Button>
<Button android:id="@+id/Button06" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Take
picture" android:width="100px" android:onClick="callIntent"></Button>
<Button android:id="@+id/Button07" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Show
contacts" android:width="100px" android:onClick="callIntent"></Button>
<Button android:id="@+id/Button08" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Edit
first contact" android:width="100px" android:onClick="callIntent"></Button>
</LinearLayout>
To be able to use certain intents you need to register then for your application. Maintain the following "AndroidManifest.xml".
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.vogella.android.intent.implicit"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".CallIntents"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="9" />
<uses-permission android:name="android.permission.CALL_PRIVILEGED"></uses-permission>
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.CAMERA"></uses-permission>
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
4. </manifest>
Change your activity to the following. We will start the new intent with the method startActivityForResult() which allow us t o specify a desired
resu lt code. Once the intent is finished the method onActivityResult() is called and you canperform actions based on the result of the activity.
package de.vogella.android.intent.implicit;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class CallIntents extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void callIntent(View view) {
Intent intent = null;
switch (view.getId()) {
case R.id.Button01:
intent = new Intent(Intent.ACTION_VIEW,
Uri.parse("http://www.vogella.de"));
startActivity(intent);
break;
case R.id.Button02:
intent = new Intent(Intent.ACTION_CALL,
Uri.parse("tel:(+49)12345789"));
5. startActivity(intent);
break;
case R.id.Button03:
intent = new Intent(Intent.ACTION_DIAL,
Uri.parse("tel:(+49)12345789"));
startActivity(intent);
break;
case R.id.Button04:
intent = new Intent(Intent.ACTION_VIEW,
Uri.parse("geo:50.123,7.1434?z=19"));
startActivity(intent);
break;
case R.id.Button05:
intent = new Intent(Intent.ACTION_VIEW,
Uri.parse("geo:0,0?q=query"));
startActivity(intent);
break;
case R.id.Button06:
intent = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(intent, 0);
break;
case R.id.Button07:
intent = new Intent(Intent.ACTION_VIEW, Uri.parse("content://contacts/people/"));
startActivity(intent);
break;
case R.id.Button08:
intent = new Intent(Intent.ACTION_EDIT, Uri.parse("content://contacts/people/1"));
startActivity(intent);
break;
default:
break;
}
}
@Override
6. public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK && requestCode == 0) {
String result = data.toURI();
Toast.makeText(this, result, Toast.LENGTH_LONG);
}
}
}
If y ou start yourapplication you should see an list of buttonsand if you press the button, different activities should be p erformed. Note that you
do not specify any specific application.
3. Explicit intents and data transfer between activities
The followingdemonstrates how you cantransfer databetween two activities. We will use explicit intents in this example and create two
activities. The first activity will call the second one via an explicit intent. This second activity will receive data from the first one via the class
"Bu ndle"which canbe retrieved via intent.getExtras().
The second activity canbe finished either via the back button on the phone or via the button. The method fin ish() is performed in this case. In
this method you cantransfer some data back to the calling activity. This is possible because we u se the method startActivity ForResult(). If you
start an activity via this method the method onActivity result is called on the callingactivity once the called activity is finshed.
Create a new Android application "de.vogella.android.intent.explicit"w ith the Activity "ActivityOne". Change the layout "main.xml"to the
follow ing.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout android:id="@+id/LinearLayout01"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<TextView android:id="@+id/TextView01" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="First Activity. Press button to call second activity"
android:minHeight="60dip" android:textSize="20sp"></TextView>
</LinearLayout>
<LinearLayout android:id="@+id/LinearLayout02"
android:layout_width="wrap_content" android:layout_height="wrap_content"></LinearLayout>
<Button android:id="@+id/Button01" android:layout_width="wrap_content"
7. android:layout_height="wrap_content" android:onClick="onClick"
android:text="Calling an intent"></Button>
</LinearLayout>
Create the layout "second.xml".
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout android:id="@+id/LinearLayout01"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<TextView android:id="@+id/TextView01" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="First value from Activity 1"></TextView>
<EditText android:text="@+id/EditText01" android:id="@+id/EditText01"
android:layout_width="wrap_content" android:layout_height="wrap_content"></EditText>
</LinearLayout>
<LinearLayout android:id="@+id/LinearLayout02"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<TextView android:id="@+id/TextView02" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Second Value from Activity one"></TextView>
<EditText android:text="@+id/EditText02" android:id="@+id/EditText02"
android:layout_width="wrap_content" android:layout_height="wrap_content"></EditText>
</LinearLayout>
<Button android:id="@+id/Button01" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:onClick="onClick"
android:text="Finished this activity"></Button>
</LinearLayout>
Create a new activity "ActivityTwo"via the AndroidManifest.
8. <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.vogella.android.intent.explicit"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".ActivityOne"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:label="ActivityTwo" android:name="ActivityTwo"></activity>
</application>
<uses-sdk android:minSdkVersion="9" />
</manifest>
Create the following coding for your two activities. The second activity will be called from the first one, displays the transferred dataand ifyou
select the button of the back button on the phone you send some data back tot the callingapplication.
package de.vogella.android.intent.explicit;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class ActivityOne extends Activity {
private static final int REQUEST_CODE = 10;
9. /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void onClick(View view) {
Intent i = new Intent(this, ActivityTwo.class);
i.putExtra("Value1", "This value one for ActivityTwo ");
i.putExtra("Value2", "This value two ActivityTwo");
// Set the request code to any code you like, you can identify the
// callback via this code
startActivityForResult(i, REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) {
if (data.hasExtra("returnKey1")) {
Toast.makeText(this, data.getExtras().getString("returnKey1"),
Toast.LENGTH_SHORT).show();
}
}
}
}
package de.vogella.android.intent.explicit;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
10. import android.widget.EditText;
public class ActivityTwo extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.second);
Bundle extras = getIntent().getExtras();
if (extras == null) {
return;
}
String value1 = extras.getString("Value1");
String value2 = extras.getString("Value2");
if (value1 != null && value2 != null) {
EditText text1 = (EditText) findViewById(R.id.EditText01);
EditText text2 = (EditText) findViewById(R.id.EditText02);
text1.setText(value1);
text2.setText(value2);
}
}
public void onClick(View view) {
finish();
}
@Override
public void finish() {
Intent data = new Intent();
data.putExtra("returnKey1", "Swinging on a star. ");
data.putExtra("returnKey2", "You could be better then you are. ");
setResult(RESULT_OK, data);
11. super.finish();
}
}
4. Registering via Intentfilter
You r application canalso register ifself for implicit intentsin Eclipse. For this you have to specify an intent filter for the selected event. Intent
filters are typically declared in "AndroidManifest.xml". An intent filter must specify category, action and data filters.
Lets create a small browser. Ourapplication will register itself as a browser and will display the HTML code for a giving webpage.
Create the Android project "de.vogella.android.intent.browserfilter"w ith the activity "BrowserActivitiy". Change "AndroidManifest.mf"to the
follow ing to register your application to the browser view intent. THe following also request the permission to access the Internet.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.vogella.android.intent.browserfilter"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".BrowserActivitiy"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http"/>
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="9" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>
Change "main.xml"to the following.
12. <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/textView"/>
</LinearLayout>
As y our activity gets called withan intent you canget the data from the intent and display it in your application.
package de.vogella.android.intent.browserfilter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;
public class BrowserActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
13. setContentView(R.layout.main);
Intent intent = getIntent();
TextView text = (TextView) findViewById(R.id.textView);
// To get the action of the intent use
System.out.println(intent.getAction());
// We current open a hard-coded URL
// To get the data the intent use the following line
//Uri data = intent.getData();
URL url;
try {
// url = new URL(data.getScheme(), data.getHost(), data.getPath());
url = new URL("http://www.vogella.de");
BufferedReader rd = new BufferedReader(new InputStreamReader(
url.openStream()));
String line = "";
while ((line = rd.readLine()) != null) {
text.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
If y ou call and URL you should be able to select your browser and the HTML code should be loaded into your textview.
14.
15. 5. Notification Manager
5.1. Notification Manager
To pu t a notification into the title barof Android you use the notification manager. The user canopen the notification bar and from the
notification another activity canget triggered.
You u se the "NotificationManager"class which canbe received from the Activity via getSystemService(). You then configure you class
"Notification"and create an intent you will call the target activity.
The followingu ses a PendingIntent whichis described in Android Services and PendingIntents .
5.2. Example
Create a new project "de.vogella.android.notificationmanager"w ith the Activity "CreateNotification". Create the following layout "result.xml".
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<TextView android:text="This is the result activity opened from the notification"
16. android:layout_width="wrap_content" android:layout_height="wrap_content"
android:id="@+id/textView1"></TextView>
</LinearLayout>
Change "main.xml"to the following.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button android:text="Create Notification" android:onClick="createNotification"
android:id="@+id/button1" android:layout_height="match_parent"
android:layout_width="match_parent"></Button>
</LinearLayout>
Create a new activity "NotificationReceiver"w ith the following coding. Don't forget to register the activity in the "Android Manfest.mf".
package de.vogella.android.notificationmanager;
import android.app.Activity;
import android.os.Bundle;
public class NotificationReceiver extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.result);
}
}
Change the activity "CreateNotification"to the following.
17. package de.vogella.android.notificationmanager;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class CreateNotification extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void createNotification(View view) {
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.icon,
"A new notification", System.currentTimeMillis());
// Hide the notification after its selected
notification.flags |= Notification.FLAG_AUTO_CANCEL;
Intent intent = new Intent(this, NotificationReceiver.class);
PendingIntent activity = PendingIntent.getActivity(this, 0, intent, 0);
notification.setLatestEventInfo(this, "This is the title",
"This is the text", activity);
notification.number += 1;
notificationManager.notify(0, notification);
18. }
}
Ru n your application and pressthe button. A new notification is created. If y ou select it your second activity will be displayed.
6. Finding out if an intent is available
Som etimes you want to find ifan application is available for a certain intent. This canbe done via checking the PackageManager. The following
code checks if an intent exists. You can check via this method for intent and change yourapplication behavior accordingly fo r example disable or
hide menu items. This tip is based on a blog entry from Romain Guy .
public boolean isIntentAvailable(Context context, String action) {
final PackageManager packageManager = context.getPackageManager();
final Intent intent = new Intent(action);
List<ResolveInfo> resolveInfo =
packageManager.queryIntentActivities(intent,
19. PackageManager.MATCH_DEFAULT_ONLY);
if (resolveInfo.size() > 0) {
return true;
}
return false;
}
7. Thank you
Please help me to support thisarticle:
8. Questions and Discussion
Before posting questions, please see the vogella FAQ . If y ou have qu estions or find an error in this article please use the www.vogella.de
Google Group . I have created a short list how to create good questions w hichmight also help you.
9. Links and Literature
9.1. Source Code
Source Code of Examples
9.2. Android Resources
Android Location API and Google Maps
Android and Netw orking
Android Homepage
Android Issues / Bugs
Android Google Groups
9.3. vogella Resources
Eclipse RCP Training (German) Eclipse RCP Training with LarsVogel
Android Tutorial Introduction to Android Programming
20. GWT Tutorial Program in Java and compile to JavaScript and HTML
Eclipse RCP Tutorial Create native applications in Java
JUnit Tutorial Test your application
Git Tutorial Pu t everything you have under distributed version control system