Activities & Intents


This post introduces Activities in Android and how Intents are used for any communication between activities or any other application components.

Activities

Activities are the fundamental building blocks of Android applications. An activity is an interface between the screen and the application. Activities, services, any application components must be declared in the AndroidManifest.xml file. If it is not done, the application considers that component of the application does not exist and often runtime exceptions are thrown when the application is being run.

This declaring of an activity, however, does not have to be done manually in the manifest file. But any kind of attributes associated with the activity can be added to the activity explicitly in the AndroidManifest.xml. For instance, an activity can be declared as the launcher activity (the first screen of the application that shows up on our screens as it runs) can be done by adding the line <category android:name="android.intent.category.LAUNCHER"></category> in the corresponding activity element in the manifest.

In any case, if an activity has to be declared manually, it can be done by creating an <activity> element in the manifest file. Next, the name and label of the activity can be specified using android:name and android:label attributes respectively. More can be learned about its attributes at https://developer.android.com/guide/topics/manifest/activity-element.

Communicating with intents

Intents are the glue between activities. Any communication between activities happens via intent. Intent holds the necessary information needed to perform an action. An intent usually has two pieces of information – action and data. In other words, intents carry information that the system uses to determine which component to start plus the information that the recipient component uses to act to perform an action properly

Intents are of two types –

  • Explicit: Explicit intents explicitly mention the component which should be called. The Java class is used as an identifier in explicit intent call.
  • Implicit: In an implicit intent, the action to be performed is specified and data is optional. Based on the type of action and data, the component that fits the most is started by the system. In some cases, if multiple components fit, the user is prompted with possible options and thus the user can decide which component to use to perform the specified action.

Explicit intent example

Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra(Intent.EXTRA_TEXT, "sample text");
startActivity(intent);

In the above example, the EXTRA_TEXT identifier is used as an identifier or any custom string can be used as well. The concept of key-value pairs is used when transmitting data using intents between two components. We use the same key to get the data out as the one we used to put data onto intent. getStringExtra() is used to fetch data from the intent. Intents are not just limited to sending String type data. Any basic Android data types can be transmitted between app components.

Implicit intent example

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.google.com"));
startActivity(intent);

In the above example, an intent object is created by specifying ACTION_VIEW as what we want to do. A URL is specified in the data, since the intention is to view the website, the default browser is launched (different data could launch different apps). Intent resolution mechanism operates by matching the best intent from the installed application packages.

Complete running examples of starting a new activity from a current one using implicit intent call and switching between activities using explicit intent can be checked at https://github.com/kamalpreetgrewal/ActivityStarter and https://github.com/kamalpreetgrewal/ActivitySwitcher respectively.

More on activities like storing data persistently, returning results from an activity is coming up in the next post. Keep reading!

Leave a Reply