Using intents in android

21
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). Table of Contents 1. Android Intents 1.1. Overview 1.2. Implicit vrs Explicit Intents 1.3. Getting the Intent data in the called Activity 1.4. Intent Filter 1.5. Intents as event triggers 1.6. Starting Activities and Sub-Activities 1.7. Android Basics 2. Implicit Intents - Opening an URL 3. Explicit intents and data transfer between activities 4. Registering via Intentfilter 5. Notification Manager 5.1. Notification Manager 5.2. Example 6. Finding out if an intent is available 7. Thank you 8. Questions and Discussion 9. Links and Literature 9.1. Source Code 9.2. Android Resources 9.3. vogella Resources 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 data from 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 used to communicate between any installed application component on the device. An Intent object can contain information for the receiving component. For example if your application calls via an Intent a browser it may send the URL to the browser component. An Intent also contain information for the Android system so that the Android system can determine which component should handle the request. 1.2. Implicit vrs Explicit Intents Android supports explicit intents and implicit intents. Explicit intent names the component, e.g. the Java class which should be called. Implicit intents asked the system to perform a service without telling the system which Java class should do this service. In constructing an implicit Intent you specify the action which should be performed and optionally an URI which should be used for this action. For example you could tell the system that you want to view (action) a webpage (URI). By starting an intent for this data the system would try to find an application which is registered for this event, e.g. a browwer. You can add more data to the Intent by adding "extras" to the Intent. These are key/value pairs.

Transcript of Using intents in android

Page 1: Using intents in android

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).

Table of Contents

1. Android Intents1.1. Overview1.2. Implicit vrs Explicit Intents1.3. Getting the Intent data in the called Activity1.4. Intent Filter1.5. Intents as event triggers1.6. Starting Activities and Sub-Activities1.7. Android Basics

2. Implicit Intents - Opening an URL3. Explicit intents and data transfer between activities4. Registering via Intentfilter5. Notification Manager

5.1. Notification Manager5.2. Example

6. Finding out if an intent is available7. Thank you8. Questions and Discussion9. Links and Literature

9.1. Source Code9.2. Android Resources9.3. vogella Resources

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 data from 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 used to communicate between any installed application component on the device.

An Intent object can contain information for the receiving component. For example if your application calls via an Intent a browser it may send the URL to the browser component. An Intent also contain information for the Android system so that the Android system can determine which component should handle the request.

1.2. Implicit vrs Explicit Intents

Android supports explicit intents and implicit intents. Explicit intent names the component, e.g. the Java class which should be called.

Implicit intents asked the system to perform a service without telling the system which Java class should do this service. In constructing an implicit Intent you specify the action which should be performed and optionally an URI which should be used for this action. For example you could tell the system that you want to view (action) a webpage (URI). By starting an intent for this data the system would try to find an application which is registered for this event, e.g. a browwer. You can add more data to 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 use the method getIntent(). If the Activity was called via an implicit Intent you can receive the data and url from this Intent via getAction(), getData() and getExtras().

Page 2: Using intents in android

1.4. Intent Filter

The Android system will determine suitable applications for an implicit intent and if several applications exists offer the user the choice to open 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 component does not define intent filters it can only be called by explicit intents.

1.5. Intents as event triggers

Intents can also be used to broadcast messages into the Android system. An Android application can registerBroadcast Receivers to these events and react accordingly. The Android system also uses Intents to broadcast system events. Your application can also register to these system events, e.g. a new email has arrived, system boot is complete or a phone call is received and react accordingly.

1.6. Starting Activities and Sub-Activities

To start an activity use the method startActivity(Intent) if you do not need a return value from the called activity.

If you need some information from the called activity use the method startActivityForResult(). Once the called Activity is finished the method onActivityResult() in the calling activity will be called. If you use startActivityForResult() then the activity which is started is considered a "Sub-Activity".

1.7. Android Basics

The following assumes 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 following creates an 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.intent.implicit" with 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>

Page 3: Using intents in android

<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>

<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>

Page 4: Using intents in android

<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>

</manifest>

Change your activity to the following. We will start the new intent with the method startActivityForResult() which allow us to specify a desired result code. Once the intent is finished the method onActivityResult() is called and you can perform 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"));

Page 5: Using intents in android

startActivity(intent);

break;

case R.id.Button02:

intent = new Intent(Intent.ACTION_CALL,

Uri.parse("tel:(+49)12345789"));

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:

Page 6: Using intents in android

break;

}

}

@Override

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 you start your application you should see an list of buttons and if you press the button, different activities should be performed. Note that you do not specify any specific application.

3. Explicit intents and data transfer between activities

The following demonstrates how you can transfer data between 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 "Bundle" which can be retrieved via intent.getExtras().

The second activity can be finished either via the back button on the phone or via the button. The method finish() is performed in this case. In this method you can transfer some data back to the calling activity. This is possible because we use the method startActivityForResult(). If you start an activity via this method the method onActivity result is called on the calling activity once the called activity is finshed.

Create a new Android application "de.vogella.android.intent.explicit" with the Activity "ActivityOne". Change the layout "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">

<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"

Page 7: Using intents in android

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"

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"

Page 8: Using intents in android

android:text="Finished this activity"></Button>

</LinearLayout>

Create a new activity "ActivityTwo" via the AndroidManifest.

<?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 data and if you select the button of the back button on the phone you send some data back tot the calling application.

package de.vogella.android.intent.explicit;

import android.app.Activity;

import android.content.Intent;

Page 9: Using intents in android

import android.os.Bundle;

import android.view.View;

import android.widget.Toast;

public class ActivityOne extends Activity {

private static final int REQUEST_CODE = 10;

/** 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();

}

}

}

}

Page 10: Using intents in android

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.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) {

Page 11: Using intents in android

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);

super.finish();

}

}

4. Registering via Intentfilter

Your application can also register ifself for implicit intents in 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. Our application 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" with the activity "BrowserActivitiy". Change "AndroidManifest.mf" to the following 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" />

Page 12: Using intents in android

<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.

<?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 your activity gets called with an intent you can get 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;

Page 13: Using intents in android

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);

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();

Page 14: Using intents in android

}

}

}

If you call and URL you should be able to select your browser and the HTML code should be loaded into your text view.

Page 15: Using intents in android

5. Notification Manager

5.1. Notification Manager

To put a notification into the title bar of Android you use the notification manager. The user can open the notification bar and from the notification another activity can get triggered.

You use the "NotificationManager" class which can be received from the Activity via getSystemService(). You then configure you class "Notification" and create an intent you will call the target activity.

The following uses a PendingIntent which is described in Android Services and PendingIntents   .

5.2. Example

Create a new project "de.vogella.android.notificationmanager" with 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"

Page 16: Using intents in android

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" with the following coding. Don't forget to register the activity in the "AndroidManfest.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);

}

}

Page 17: Using intents in android

Change the activity "CreateNotification" to the following.

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",

Page 18: Using intents in android

"This is the text", activity);

notification.number += 1;

notificationManager.notify(0, notification);

}

}

Run your application and press the button. A new notification is created. If you select it your second activity will be displayed.

6. Finding out if an intent is available

Sometimes you want to find if an application is available for a certain intent. This can be done via checking the PackageManager. The following code checks if an intent exists. You can check via this method for intent and change your application behavior accordingly for example disable or hide menu items. This tip is based on a blog entry from Romain Guy   .

public boolean isIntentAvailable(Context context, String action) {

Page 19: Using intents in android

final PackageManager packageManager = context.getPackageManager();

final Intent intent = new Intent(action);

List<ResolveInfo> resolveInfo =

packageManager.queryIntentActivities(intent,

PackageManager.MATCH_DEFAULT_ONLY);

if (resolveInfo.size() > 0) {

return true;

}

return false;

}

7. Thank you

Please help me to support this article:

 

8. Questions and Discussion

Before posting questions, please see the vogella FAQ . If you have questions 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   which might 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 Networking

Android Homepage

Android Issues / Bugs

Android Google Groups

9.3. vogella Resources

Page 20: Using intents in android

Eclipse RCP Training   (German) Eclipse RCP Training with Lars Vogel

Android Tutorial   Introduction to Android Programming

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   Put everything you have under distributed version control system