Logo Icon Logo
A Crowd-sourced Cookbook on Writing Great Android® Apps
GitHub logo Twitter logo OReilly Book Cover Art
Retrieving Data from a Subactivity Back to Your Main ActivityBack to Android Cookbook Home | Up to Chapter: Inter/Intra-Application Communication

Author: Ulysses Levy ('aschyiel')
In Published Edition? Yes
FormatLanguage: WikiFormat

Retrieving Data from a Subactivity Back to Your Main Activity

Problem

Your main activity needs to retrieve data from a sub activity.

Solution

Use startActivityForResult(), and onActivityResult() in the main activity, and setResult() in the sub-activity.

Discussion

In this example we return a string from a Sub-Activity (MySubActivity) back to the Main Activity (MyMainActivity).

The first step is to "push" data from MyMainActivity via the Intent mechanism.

public class MyMainActivity extends Activity
{
    //..for logging..
    private static final String TAG = "MainActivity";
        
    //..The request code is supposed to be unique?..
    public static final int MY_REQUEST_CODE = 123;
    
    @Override
    public void onCreate( Bundle savedInstanceState )
    {
        ...
    }
    
    private void pushFxn()
    {
        Intent intent = 
            new Intent( 
                this, 
                MySubActivity.class );
                
        startActivityForResult( intent, MY_REQUEST_CODE );
    }
    
    protected void onActivityResult(
            int requestCode, 
            int resultCode,
            Intent pData) 
    {
         if ( requestCode == MY_REQUEST_CODE ) 
         {
             if (resultCode == Activity.RESULT_OK ) 
             {
                 final String zData = pData.getExtras().getString( MySubActivity.EXTRA_STRING_NAME );
                 
                 //..do something with our retrieved value..
                 
                 Log.v( TAG, "Retrieved Value zData is "+zData );
                 //..logcats "Retrieved Value zData is returnValueAsString" 
                 
             }
         }
         
     }
}

Notes:

The second major step is to "pull" data back from MySubActivity to MyMainActivity.

public class MySubActivity extends Activity
{
    public static final String EXTRA_STRING_NAME = "extraStringName";
    
    @Override
    public void onCreate( Bundle savedInstanceState )
    {
        ...
    }        
    
        
    private void pullFxn()
    {
        Intent iData = new Intent();
        iData.putExtra( 
            EXTRA_STRING_NAME, 
            "returnValueAsString" );
        
        setResult( 
            android.app.Activity.RESULT_OK,
            iData );
        
        //..returns us to the parent "MyMainActivity"..
        finish();
    }
}

Code Notes:

Other

Use Case (informal)

In my app, I have a ListActivity with a ContextMenu (user long presses a selection to do something), and I wanted to let the Main-Activity know which row the user had selected for the ContextMenu action ( atm, my app only has one action ). I ended up using intent extras to pass the selected row's index as a string back to the parent activity; From there I could just convert the index back to an int and use it to identify the user row selection via ArrayList.get( index ). This worked for me, however I am sure there is another/better way.

See Also

Also see How to push string-values using Intent.putExtra()

ResultCode "gotcha"

startActivityForResultExample (under "Returning a Result from a Screen")

(android.content.Intent, int) Activity.startActivityForResult()