Android Passing Data Between Screens Complete Guide

 Last Update:2025-06-22T00:00:00     .NET School AI Teacher - SELECT ANY TEXT TO EXPLANATION.    7 mins read      Difficulty-Level: beginner

Understanding the Core Concepts of Android Passing Data Between Screens

Android Passing Data Between Screens

Methods to Pass Data:

  1. Intent Extras:

    • Explanation: The most common way to pass data between activities. Extras allow you to attach primitive data types or objects that have implemented Parcelable or Serializable interfaces to the intent.
    • Implementation:
      // Sending data
      Intent i = new Intent(CurrentActivity.this, NextActivity.class);
      i.putExtra("key", value);
      startActivity(i);
      
      // Receiving data
      Bundle extras = getIntent().getExtras();
      if (extras != null) {
          String value = extras.getString("key");
      }
      
    • Considerations: Best suited for small amounts of data. Avoid passing large objects as they can lead to performance issues.
  2. ViewModel:

    • Explanation: The ViewModel class holds state information associated with UI components. It’s designed to store data in a way that survives configuration changes such as screen rotations.
    • Implementation:
      // In Current Activity/Fragment
      viewModel = new ViewModelProvider(this).get(MyViewModel.class);
      viewModel.setData(value);
      
      // In Next Activity/Fragment
      viewModel = new ViewModelProvider(requireActivity()).get(MyViewModel.class);
      String value = viewModel.getData();
      
    • Considerations: Ideal for sharing information across different components that don't share a direct parent-child relationship.
  3. Fragment Arguments:

    • Explanation: Similar to intent extras but used specifically for passing data to fragments.
    • Implementation:
      // Sending data
      Fragment nextFragment = new NextFragment();
      Bundle args = new Bundle();
      args.putString("key", value);
      nextFragment.setArguments(args);
      
      // Receiving data
      String value = getArguments().getString("key");
      
    • Considerations: Suitable for static values since the arguments are set before the fragment is instantiated.
  4. Singleton Pattern:

    • Explanation: A singleton acts as a global data storage that can be accessed from any class. It ensures a single instance of an object throughout the application lifecycle.
    • Implementation:
      public class MySingleton {
          private static volatile MySingleton instance;
          private String data;
      
          private MySingleton() {}
      
          public static MySingleton getInstance() {
              if (instance == null) {
                  synchronized (MySingleton.class) {
                      if (instance == null) {
                          instance = new MySingleton();
                      }
                  }
              }
              return instance;
          }
      
          public String getData() {
              return data;
          }
      
          public void setData(String data) {
              this.data = data;
          }
      }
      
    • Considerations: Can cause memory leaks if not managed properly because it retains data even when fragments or activities are destroyed.
  5. Database Storage (e.g., SQLite, Room):

    • Explanation: For more complex data structures and persistent storage, using databases is effective.
    • Implementation: Refer to Room documentation for setting up and querying data.
    • Considerations: Overhead associated with database transactions which might impact performance if not optimized.
  6. SharedPreferences:

    • Explanation: SharedPreferences is a lightweight storage option for key-value pairs suitable for simple settings and user preferences.
    • Implementation:
      // Writing data
      SharedPreferences sharedPreferences = getSharedPreferences("my_prefs", MODE_PRIVATE);
      SharedPreferences.Editor editor = sharedPreferences.edit();
      editor.putString("key", value);
      editor.apply();
      
      // Reading data
      String value = sharedPreferences.getString("key", defaultValue);
      
    • Considerations: Not recommended for frequent read/write operations as it’s slower than memory-based solutions.
  7. Files:

    • Explanation: Writing data to files is useful for larger datasets that require persistent storage.
    • Implementation: Use standard file operations like FileOutputStream and FileInputStream.
    • Considerations: File I/O operations are slower than memory-based operations and need to be managed carefully to avoid security risks.
  8. BroadcastReceiver:

    • Explanation: BroadcastReceivers can receive messages (broadcast intents) from other components. Useful for sending data from one component to another without direct interaction.
    • Implementation: Define a receiver in your target activity or fragment and send broadcasts from another component.
    • Considerations: Less suitable for passing data that needs to be received reliably as broadcast receivers depend on active registration.
  9. Content Providers:

    • Explanation: Content providers manage access to a structured set of data. They are used for sharing data across applications.
    • Implementation: Set up a content provider that exposes specific URI paths for your data.
    • Considerations: Complex setup but essential for inter-app communication.
  10. Custom Application Class:

    • Explanation: A custom application class serves as a central repository for storing shared data accessible across different parts of your app.
    • Implementation: Extend Application, add necessary methods, and use it wherever needed within your activities and fragments.
    • Considerations: Like singletons, careful management is required to avoid memory leaks.

Important Considerations:

  • Data Size Limitation: Intents have a limited size (around 1MB) due to system parcel limitations. Always evaluate the data size requirements and choose an appropriate method.
  • Thread Safety: Be cautious of thread safety, especially when using global storage mechanisms like singletons and application classes.
  • Lifecycle Awareness: Use lifecycle-aware components such as ViewModel to manage data across configuration changes effectively.
  • Security: Ensure sensitive data is encrypted and securely stored to prevent unauthorized access.
  • Memory Management: Frequent creation and destruction of large objects can cause memory overflow. Optimize object allocation and reuse where possible.
  • Data Consistency: When sharing data across multiple components, ensure the data consistency and synchronization to avoid stale or inconsistent data.
  • Performance: Choose data passing methods based on your app’s performance needs. Memory-based solutions are typically faster than disk-based ones.

Online Code run

🔔 Note: Select your programming language to check or run code at

💻 Run Code Compiler

Step-by-Step Guide: How to Implement Android Passing Data Between Screens

Prerequisites:

  • Android Studio installed.
  • Basic knowledge of Android development (Java/Kotlin).

Example Scenario:

We will create a simple application with two screens (activities). The first screen (MainActivity) will send a username and age to the second screen (SecondActivity), where these details will be displayed.

Step 1: Create New Android Project

  1. Open Android Studio.
  2. Click "Start a new Android Studio project".
  3. Choose "Empty Activity" and click Next.
  4. Set the Name as PassingDataExample.
  5. Set the Package name as com.example.passingdataexample.
  6. Choose Java or Kotlin as your language.
  7. Set Minimum API level as per your needs (e.g., API 21: Android 5.0.1 Lollipop).
  8. Click Finish.

Step 2: Design the First Screen (MainActivity)

  1. Open activity_main.xml (under res/layout).
  2. Replace its content with the following code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/editTextUsername"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter Username" />

    <EditText
        android:id="@+id/editTextAge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter Age"
        android:inputType="number" />

    <Button
        android:id="@+id/buttonSendData"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send Data" />
</LinearLayout>

Step 3: Implement MainActivity Logic

  1. Open MainActivity.java or MainActivity.kt.
  2. Replace its content with the following code:

Java

package com.example.passingdataexample;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    EditText editTextUsername, editTextAge;
    Button buttonSendData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editTextUsername = findViewById(R.id.editTextUsername);
        editTextAge = findViewById(R.id.editTextAge);
        buttonSendData = findViewById(R.id.buttonSendData);

        buttonSendData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String username = editTextUsername.getText().toString();
                String age = editTextAge.getText().toString();

                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                intent.putExtra("USERNAME_KEY", username);
                intent.putExtra("AGE_KEY", age);
                startActivity(intent);
            }
        });
    }
}

Kotlin

package com.example.passingdataexample

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText

class MainActivity : AppCompatActivity() {

    private lateinit var editTextUsername: EditText
    private lateinit var editTextAge: EditText
    private lateinit var buttonSendData: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        editTextUsername = findViewById(R.id.editTextUsername)
        editTextAge = findViewById(R.id.editTextAge)
        buttonSendData = findViewById(R.id.buttonSendData)

        buttonSendData.setOnClickListener {
            val username = editTextUsername.text.toString()
            val age = editTextAge.text.toString()

            val intent = Intent(this, SecondActivity::class.java)
            intent.putExtra("USERNAME_KEY", username)
            intent.putExtra("AGE_KEY", age)
            startActivity(intent)
        }
    }
}

Step 4: Create the Second Screen (SecondActivity)

  1. Right-click the java folder in app/src/main -> New -> Activity -> Empty Activity.
  2. Name the activity as SecondActivity.
  3. Click Finish.

Step 5: Design the Second Screen Layout

  1. Open activity_second.xml (under res/layout).
  2. Replace its content with the following code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    tools:context=".SecondActivity">

    <TextView
        android:id="@+id/textViewUsername"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Username:"
        android:textSize="18sp"
        android:layout_marginBottom="8dp" />

    <TextView
        android:id="@+id/textViewAge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Age:"
        android:textSize="18sp" />
</LinearLayout>

Step 6: Implement SecondActivity Logic

  1. Open SecondActivity.java or SecondActivity.kt.
  2. Replace its content with the following code:

Java

package com.example.passingdataexample;

import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {

    TextView textViewUsername, textViewAge;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        textViewUsername = findViewById(R.id.textViewUsername);
        textViewAge = findViewById(R.id.textViewAge);

        String username = getIntent().getStringExtra("USERNAME_KEY");
        String age = getIntent().getStringExtra("AGE_KEY");

        textViewUsername.append(" " + username);
        textViewAge.append(" " + age);
    }
}

Kotlin

package com.example.passingdataexample

import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity

class SecondActivity : AppCompatActivity() {

    private lateinit var textViewUsername: TextView
    private lateinit var textViewAge: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        textViewUsername = findViewById(R.id.textViewUsername)
        textViewAge = findViewById(R.id.textViewAge)

        val username = intent.getStringExtra("USERNAME_KEY")
        val age = intent.getStringExtra("AGE_KEY")

        textViewUsername.text = "Username: $username"
        textViewAge.text = "Age: $age"
    }
}

Step 7: Update AndroidManifest.xml

Ensure both MainActivity and SecondActivity are declared in the AndroidManifest.xml.

Top 10 Interview Questions & Answers on Android Passing Data Between Screens

Top 10 Questions and Answers on Android Passing Data Between Screens

1. How can you pass simple data types (e.g., Strings, Integers) from one Activity to another?

Answer: To pass simple data types between activities, you can use an Intent with putExtra() to add the data you want to send, and getIntent().getExtras() to retrieve it in the target activity.

Example:

// Sending data
Intent intent = new Intent(SourceActivity.this, DestinationActivity.class);
intent.putExtra("key_string", "Hello World");
intent.putExtra("key_int", 100);
startActivity(intent);

// Retrieving data
String receivedString = getIntent().getStringExtra("key_string");
int receivedInt = getIntent().getIntExtra("key_int", 0); // Default value is 0 if no data is found

2. How do you pass complex objects (e.g., a custom class) between activities?

Answer: For passing complex objects, the class needs to implement Serializable or Parcelable interfaces. Parcelable is more efficient and recommended.

Example: Implementing Parcelable:

public class MyData implements Parcelable {
    private String name;
    private int age;

    public MyData(String name, int age) {
        this.name = name;
        this.age = age;
    }

    protected MyData(Parcel in) {
        name = in.readString();
        age = in.readInt();
    }

    public static final Creator<MyData> CREATOR = new Creator<MyData>() {
        @Override
        public MyData createFromParcel(Parcel in) {
            return new MyData(in);
        }

        @Override
        public MyData[] newArray(int size) {
            return new MyData[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(name);
        parcel.writeInt(age);
    }
}

// Sending MyData object
Intent intent = new Intent(SourceActivity.this, DestinationActivity.class);
intent.putExtra("key_mydata", new MyData("John Doe", 25));
startActivity(intent);

// Retrieving data
MyData receivedData = getIntent().getParcelableExtra("key_mydata");

3. What is the difference between startActivityForResult() and startActivity()?

Answer: startActivity() is used to start an activity and does not wait for a result. startActivityForResult() starts an activity and returns a result to the activity that started it, using onActivityResult() method to handle the result.

Example:

// Starting an activity for result
Intent intent = new Intent(SourceActivity.this, DestinationActivity.class);
startActivityForResult(intent, REQUEST_CODE); // REQUEST_CODE can be any int

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        // Handle the returned data
        String result = data.getStringExtra("result_key");
    }
}

// In DestinationActivity, you can send data back:
Intent resultIntent = new Intent();
resultIntent.putExtra("result_key", "Result from Destination");
setResult(RESULT_OK, resultIntent);
finish();

4. How can you pass data between fragments?

Answer: To pass data between fragments, you can use setArguments() and getArguments() methods with a Bundle.

Example:

// Creating arguments for the fragment
Bundle args = new Bundle();
args.putString("key_string", "Fragment Data");
args.putInt("key_int", 200);

DestinationFragment fragment = new DestinationFragment();
fragment.setArguments(args);

// In DestinationFragment
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        String receivedString = getArguments().getString("key_string");
        int receivedInt = getArguments().getInt("key_int");
    }
}

5. How do you pass data from a Fragment to an Activity?

Answer: There are multiple ways to do this—using an Interface, ViewModel, or by calling methods on the Activity directly (usually not recommended due to tight coupling).

Example using Interface:

// Interface to define callback
public interface DataCallback {
    void onDataReceived(String data);
}

// In the Fragment
private DataCallback callback;

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    callback = (DataCallback) context;   // assuming Activity implements DataCallback
}

private void sendDataToActivity() {
    callback.onDataReceived("Data from Fragment");
}

// In the Activity
public class MainActivity extends AppCompatActivity implements DataCallback {

    @Override
    public void onDataReceived(String data) {
        // Handle the data
    }
}

6. How can you pass data using intents and flags?

Answer: You can use different Intent flags to alter the behavior of the activity launch. For example, FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_CLEAR_TOP, etc.

Example with FLAG_ACTIVITY_NEW_TASK:

Intent intent = new Intent(SourceActivity.this, DestinationActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

7. Can you pass data between dialogs and activities?

Answer: Yes, dialogs can also receive data via intents if shown from an Activity. Custom DialogFragments can use Bundle for passing data similar to passing data between fragments.

Example for a Custom DialogFragment:

public class MyDialogFragment extends DialogFragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle arguments = getArguments();
        if (arguments != null) {
            String data = arguments.getString("key_dialog");
            // Use the data
        }
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage("Data received: " + getArguments().getString("key_dialog"));
        return builder.create();
    }

    public static MyDialogFragment newInstance(String data) {
        MyDialogFragment fragment = new MyDialogFragment();
        Bundle args = new Bundle();
        args.putString("key_dialog", data);
        fragment.setArguments(args);
        return fragment;
    }
}

// Showing dialog from an Activity
MyDialogFragment dialogFragment = MyDialogFragment.newInstance("Hello from Activity");
dialogFragment.show(getSupportFragmentManager(), "MyDialog");

8. How do you pass data using ViewModel?

Answer: Using ViewModel from Android Architecture Components is a recommended way to manage data that needs to be shared between different components and survive configuration changes. Data is stored in a LiveData object within the ViewModel.

Example:

// ViewModel class
public class SharedDataViewModel extends ViewModel {
    private MutableLiveData<String> data;

    public LiveData<String> getData() {
        if (data == null) {
            data = new MutableLiveData<>();
        }
        return data;
    }

    public void setData(String value) {
        data.setValue(value);
    }
}

// In the first Activity
SharedDataViewModel model = new ViewModelProvider(this).get(SharedDataViewModel.class);
model.setData("Data to be shared");

// In the second Activity
SharedDataViewModel model = new ViewModelProvider(this).get(SharedDataViewModel.class);
model.getData().observe(this, new Observer<String>() {
    @Override
    public void onChanged(@Nullable String s) {
        // Update the UI
    }
});

9. What are the drawbacks of using startActivityForResult()?

Answer: The main drawbacks include:

  • It leads to tightly coupled code.
  • Complex flows can get difficult to manage.
  • onActivityResult() gets called for every result, so managing multiple requests can become complex.

10. How can you pass large data sets between activities?

Answer: For large data sets, passing data through intents can hit the TransactionTooLargeException due to the limit on the size of data that can be passed. In such cases, use other storage alternatives like SQLite, SharedPreferences, or storing the data temporarily in a ViewModel and passing only an identifier between activities.

Example:

You May Like This Related .NET Topic

Login to post a comment.