There are four basic building blocks of an Android Application -
1. Activity
2. Intent Receivers
3. Service
4. Content Providers
In this post we will go in details of the activity. Activities represent the application screens in Android. Android platform define a class ‘Activity’, all the activities have to extend from Activity class.
Android platform is designed in such way that all applications can expose interfaces using above mentioned 4 building blocks through which they can interact with each other. There fore defining screens in XML is major feature required in developing such no-boundary application.
Designing user screen in XML:
The activity (screen) consists of views and viewgroups. Views are the standard screen components like TextView (Label), Buttons, CheckBox, EditText (textbox) etc. The viewgroups are special views that can contain other views and thus viewgroups can be used as panels to arrange the views on the screen. Viewgroups examples are LinearLayout, RelativeLayout, AbsoluteLayout etc.
Android supports XML syntax for designing application screens. Let’s develop an xml layout of screen which takes user’s first name and last name.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/widget28"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/firstNameLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="First Name:">
</TextView>
<EditText
android:id="@+id/firstName"
android:layout_width="319px"
android:layout_height="wrap_content"
android:textSize="18sp">
</EditText>
<TextView
android:id="@+id/lastNameLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Last Name:">
</TextView>
<EditText
android:id="@+id/lastName"
android:layout_width="320px"
android:layout_height="wrap_content"
android:textSize="18sp">
</EditText>
<Button
android:id="@+id/submitButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Submit"
android:layout_gravity="center_horizontal">
</Button>
</LinearLayout>
There are visual tools available for creating android XML screen layout. Try out droiddraw.
The above activity layout shows two textboxes for user’s first Name and last Name. Each view controls is assigned an id to identify and access the control. Activity layouts are stored under resources directory as layouts (in res/layout dir).
Activity intents:
Each activity is associated with intents which specify what the Activity can do. Activity intent consists of action and data required by the activity. The activity intents are specified in the application AndroidManifest.xml file as intent filters. Activity can support multiple actions. See the example below:
<activity class=".SomeActivity" android:label="@string/activityTitle">
<intent-filter>
<action android:value="android.intent.action.VIEW" />
<category android:value="android.intent.category.DEFAULT" />
<type android:value="content://contacts" />
</intent-filter>
</activity>
The above activity supports the view action for contact data. That means the activity display the phone contacts. There are some standard intent actions defined by the android platform like VIEW, EDIT, MAIN etc. But custom intent actions can also be specified as shown below:
<activity class=".TestActivity" android:label="@string/activityTitle">
<intent-filter>
<action android:value="com.wissen.testApp.activities.TEST_ACTIVITY" />
<category android:value="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
This activity can be used by using the TEST_ACTIVITY intent. We will see how to create activity with intents in following part of post.
Application Launcher Activity:
Every android application has a Launcher activity. The launcher activity is the activity that gets control when the application starts.
Launcher activity must support predefined intent ‘android.intent.action.MAIN’ and has category ‘android.intent.category.LAUNCHER’.
The launcher activity can be specified in the AndroidManifest.xml as follows:
<activity class=".WelcomeActivity" android:label="@string/app_name">
<intent-filter>
<action android:value="android.intent.action.MAIN" />
<category android:value="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Creating an Activity:
All the activity must extend android ‘Activity’ class. onCreate() method gets called when an activity is created.
Let create an activity for the layout we defined earlier. Here is the code…
package com.wissen.testApp;
public class UserInfoActivity extends Activity {
private EditText firstName;
private EditText lastName;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
firstName = (EditText) findViewById(R.id.firstName);<
lastName = (EditText) findViewById(R.id.lastName);
submitButton = (Button) findViewById(R.id.saveButton);
}
}
The above activity class overrides the onCreate method. The onCreate is the activity lifecycle method and as name suggests it gets call when activity is created. So the onCreate method is the entry point for an activity.
Activity calls the setContentView method to assign the layout that we defined earlier. The Resource class is used to refer to the xml layout main (the xml file name is main.xml).
As we saw in the xml layout all the view controls as assigned id's to them. The activity can refer to the view with the help of these defined ids by using the findViewById method.
So now our activity is using layout that we defined and also has access to the firstName, lastName and button controls.
Lets define an onClick event handler for the submit button. The event handler will just show user provide firstName and LastName in a notification.
public class UserInfoActivity extends Activity implements View.OnClickListener {
private EditText firstName;
private EditText lastName;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
//.......
}<
public void onClick(View view) {
if(view.getId() == R.id.submitButton) {
Toast.makeText(context, "Hi " + firstName.getText() + " " + lastName.getText().toString(), Toast.LENGTH_LONG).show();
}
}
}
Define the above activity as the launcher activity in the AndroidManifest.xml file and the activity will be called when the application will start.
Activity Lifecycle:
Let see what the lifecycle of the android activity is. Activity class supports following lifecycle methods,
onCreate(): Called when the activity is first created. This is where setting up views is done. This method also provides you with a Bundle containing the activity's previous state (if any).
onRestart(): Called just before activity is being started after it has been stopped.
onStart(): Called when the activity is becoming visible to the user. Followed by onResume() if the activity is at the top of the activity stack.
onResume(): Called when the activity will start interacting with the user, i.e. activity is at the top of the activity stack.
onPause(): Called just before some other activity become active and user start interacting with the new activity. This method can be used to save unsaved changes.
onStop(): Called when the activity is no longer visible to the user. This may happen either because a new activity become visible, or this one is being destroyed.
onDestroy(): This method is called just before the activity is destroyed. The activity can be destroyed by calling finish() method.
Starting an Activity:
We have seen how to create and show a launcher activity. To show other activities in the application the activities has to be started.
Support you have defined an as activity as follows:
package com.wissen.testApp;
public class TestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
// ........
}
}
AndroidManifest.xml contains:
<activity class=".TestActivity" android:label="@string/activityTitle">
<intent-filter>
<action android:value="com.wissen.testApp.activities.TEST_ACTIVITY" />
<category android:value="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
To show this activity to the user, the activity must be started (this can happen on some event). Here is show the activity can be started
Intent testActivityIntent = new Intent();
testActivityIntent.setAction("com.wissen.testApp.activities.TEST_ACTIVITY");
startActivity(myProfileIntent);
The activity can also be started by setting the Activity class name in the intent. Like
intent.setClass(context, TestActivity.class);
Sometimes the caller activity need some return value from the called activity. In that case the caller will start the activity with the help of startActivityForResult() method. The caller will get the result onActivityResult() method as follows:
public class MyActivity extends Activity {
// ...
static final int REQUEST_CODE = 0;
protected boolean onKeyDown(int keyCode, KeyEvent event) {
startActivityForResult(
new Intent("activity.Action"),
REQUEST_CODE);
return true;
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// .. do something with the result
}
}
}
}
The REQUEST_CODE will be return back by the called activity to identify the request.
This is all on the activities. In subsequent posts we will see other building blocks of the android platform.
Android Basics
Activity, Android, Android API, Basics of Android