Android - Intent (Start Activity, Service and Deliver Broadcast)

> Android

1 - About

An Intent is a messaging object you can use to request an action from an app component.

There are three fundamental use-cases:

Advertising

3 - Use cases

3.1 - Start an activty

  • To start an activity , pass an Intent to startActivity(). The Intent describes the activity to start and carries any necessary data.
  • To receive a result from the activity when it finishes, call startActivityForResult(). Your activity receives the result as a separate Intent object in your activity's onActivityResult() callback.
Intent intent = new Intent();
intent.setClass(getContext(), DetailActivity.class);
startActivity(intent);

3.2 - Start a service

  • To start a service to perform a one-time operation (such as download a file) by passing an Intent to startService(). The Intent describes the service to start and carries any necessary data.

If the service is designed with a client-server interface, you can bind to the service from another component by passing an Intent to bindService().

3.3 - Deliver a broadcast

You can deliver a broadcast to other apps by passing an Intent to sendBroadcast(), sendOrderedBroadcast(), or sendStickyBroadcast().

4 - Type

There are two types of intents:

  • Explicit
  • Implicit
Advertising

4.1 - Explicit

Explicit intents specify the component to start by name (the fully-qualified class name). You'll typically use an explicit intent to start a component in your own app, because you know the class name of the activity or service you want to start.

For example, start a new activity in response to a user action or start a service to download a file in the background.

Explicit Intents have specified a component (via setComponent(ComponentName) or setClass(Context, Class)), which provides the exact class to be run.

Intent intent = new Intent();
intent.setClass(getContext(), DetailActivity.class);
startActivity(intent);

4.2 - Implicit

Implicit intents do not name a specific component, but instead declare a general action to perform, which allows a component from another app to handle it. For example, if you want to show the user a location on a map, you can use an implicit intent to request that another capable app show a specified location on a map.

Implicit intent are resolved through the filter applied to an activity that tells which kind of data an activity can handle.

4.2.1 - Filter

Example for Google Maps that can handle every URI with the geo scheme.

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <data android:scheme="geo" />
</intent-filter>

4.2.2 - Show a map

From the Common Intent, Maps Intent

Example where the location is in a preference

private void showMap() {
 
	SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this.getContext());
	String postalCode = sharedPref.getString(getString(R.string.pref_location_key), getString(R.string.pref_location_default));
 
        Intent intent = new Intent(Intent.ACTION_VIEW);
	Uri geoLocation = Uri
			.parse("geo:0,0?")
			.buildUpon()
			.appendQueryParameter("q", postalCode)
			.build();
	intent.setData(geoLocation);
 
        // This test verify that the intent can be handled
	if (intent.resolveActivity(getContext().getPackageManager()) != null) {
		startActivity(intent);
	} else {
            Log.d(LOG_TAG, "Couldn't call " + location + ", no receiving apps installed!");
       }
}
Advertising

4.2.3 - Share

Share intent

5 - Documentation / Reference