Wednesday, 20 August 2014

Android Intents for Passing Data between Activities

 How to pass primitive data type from one activity to other:
How to pass primitive data from one Activity to other.
In Android to pass data from one Activity to other we use Intent class objects. Intents can be thought of mechanism to pass objects between activity or broadcast reciver or services.
Example:
Let us say we have an acivity, ActivityOne which has a  TextView and a Button. The user enters some text in the text box and clicks on the Button. The click event will redirect the user to the next Activity, ActivityTwo. ActivityTwo displays a customised welcome message to the user with the text entered by user in ActivityOne. We have to pass the text entered by the user in ActivityOne to ActivityTwo. This can be achieved by creating Intent Object.
ActivityOne .java
package com.passdata;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
 
public class ActivityOne extends Activity {
EditText editText;
Button button;
 
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/** setting the view of the activity to xml */
setContentView(R.layout.main);
 
editText= (EditText) findViewById(R.id.edit1);
button= (Button) findViewById(R.id.btn);
 
button.setOnClickListener(new OnClickListener() {
 
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
 
/** getting the value of edit text entered by user */
final String textVal = editText.getText().toString();
 
Intent intent = new Intent(ActivityOne.this,
ActivityTwo.class);
 
/** setting the textVal in intentExtra */
intent.putExtra("name", textVal);
intent.putExtra("testBool", true);
 
startActivity(intent);
}
});
 
}
}
main.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"
>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/edit1"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn"
android:text="@string/buttonText"
 
/>
</LinearLayout>
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, ActivityPassDataActivity!</string>
    <string name="app_name">ActivityPassData</string>
    <string name="buttonText">Pass Data</string>
</resources>
In the button onClickListener we are creating an Intent object. The Intent object takes 2 arguments. First argument is the context and second is the Class to which the intent is passed. In this example we are passing the intent to ActivityTwo, so we are setting the class as ActivityTwo.class. The Intent object has a public method putExtra. This method takes 2 arguments. The first argument is the key and 2nd argument is the value for that key.  The 2nd argument can be of any type boolean , float, double, long etc. For example, if we have to pass boolean we can use i.putExtra(“test”, true);

Retrieve data passed in ActivityTwo:
ActivityTwo.java
package com.passdata;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
 
public class ActivityTwo extends Activity {
 
TextView textView;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
/** setting the view of the activity to xml */
setContentView(R.layout.activity2);
textView = (TextView) findViewById(R.id.txt2);
 
/**get the intent*/
Intent intent = getIntent();
 
/**retrieve the string extra passed*/
String stringRecd = intent.getStringExtra("name");
 
/*retrieve the boolean extra passed*/
Boolean boolRecd = intent.getBooleanExtra("testBool", false);
textView.setText(stringRecd + ":boolval:"+boolRecd );
}
 
}
activity2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
 
<TextView android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/txt2"
android:layout_marginTop="30sp"
android:gravity="center"
/>
 
</LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
      package="com.passdata"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />
 
    <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:name="ActivityTwo"></activity>
 
    </application>
</manifest>
To retreive the data passed in intent first we get the intent object. The activity class has method called getIntent() that returns the intent object that started this activity. Once we have the intent object  we can use getStringExtra or getBooleanExtra or getFloatExtra depending on the data type passed in intent. In the above example to get the string type passed in the intent we used getStringExtra. This method takes the string argument which is the key used when we set the data in intent object in ActivityOne. In the method intent.getBooleanExtra(“testBool”, false), the second argument is the defaultValue to be returned if no value of the desired type is stored with the given name.