views:

767

answers:

0

Hello all,

I have written a simple app which has an 'About' screen (activity) that is shown when the user selects the 'About' item in the Options Menu from the main activity. The 'About' screen has a button named 'Close' on it.

The behaviour I want is that when the user clicks the 'Close' button, she/he should be taken to the previous activity (i.e. the activity from which the About activity was launched). For this I launch the About activity (TFTAbout) from the main activity (TFT) using startActivityForResult(); then in TFTAbout.java I invoke setResult() and finish(), which should in turn invoke onActivityResult() in the main activity when I click 'Close'.

What actually happens is that when I click 'Close' the main activity (TFT) is not called.

From the logs it appears that the activity TFTAbout does execute setResult() and finish(). However, at this very point, onDestroy is called for the main activity. So, my guess is that since there is no launching activity to return to, onActivityResult() is not being called. Am I right?


Please refer to Logcat output below (without timestamps for better readabiliy):

DEBUG/TFT(816): onOptionsItemSelected: 'About' item selected.

INFO/ActivityManager(563): Starting activity: Intent { action=android.intent.action.GET_CONTENT type=text/plain comp={com.wirel.tft/com.wirel.tft.TFTAbout} }

DEBUG/TFTAbout(816): onCreate: START

DEBUG/TFTAbout(816): onCreate: END

INFO/ActivityManager(563): Displayed activity com.wirel.tft/.TFTAbout: 3880 ms

DEBUG/TFT(816): onDestroy: BEGIN

DEBUG/TFT(816): onDestroy: END

DEBUG/dalvikvm(606): GC freed 672 objects / 36656 bytes in 90ms

DEBUG/TFTAbout(816): onClick: 'Close' button pressed... Returning to calling activity.

WARN/ActivityManager(563): Activity pause timeout for HistoryRecord{4370efe0 {com.wirel.tft/com.wirel.tft.TFTAbout}}

WARN/ActivityManager(563): Activity destroy timeout for HistoryRecord{4370efe0 {com.wirel.tft/com.wirel.tft.TFTAbout}}

DEBUG/TFTAbout(816): onClick: Activity is finishing? true


Code of the lauching activity (TFT):

@Override
public boolean onOptionsItemSelected( MenuItem mi ) 
{
    int item_id = mi.getItemId();
    switch ( item_id )
    {
        case R.id.mi_about:
        {
            Log.d( LOG_TAG, "onOptionsItemSelected: 'About' selected." );
            /* Start the activity to display the About page. */
            Intent i = new Intent( Intent.ACTION_GET_CONTENT,
                                   TFTMetadata.ABOUT_TEXT_URI );
            i.setType( "text/plain" );

            startActivityForResult( i, 0 );
            break;
        }
        ....
 }


@Override
    protected void onActivityResult
        ( int request_code, int result_code, Intent i )
{
    Log.d( LOG_TAG, "onActivityResult: START." );

    super.onActivityResult( request_code, result_code, i );

    /* Use the request code to select between multiple child activities we may have started. Here there is only one thing we launch. */

    if ( request_code == Activity.RESULT_FIRST_USER )
    {
        Log.d( LOG_TAG, "onActivityResult: 'About' activity has returned." );
    }
} 

Code of the launched activity (TFTAbout):

@Override
public void onCreate( Bundle savedInstanceState )
{
    Log.d( LOG_TAG, "onCreate: START" );

    super.onCreate( savedInstanceState );

    /* Set what to do when the user presses a key but the key press is
     not handled by the application. */
    setDefaultKeyMode( DEFAULT_KEYS_DISABLE );

    /* Connect the appropriate resource to this activity. */
    setContentView( R.layout.about );

    /* Define the click listener for the Close button. */
    Button b = (Button) findViewById( R.id.bt_close );
    b.setOnClickListener( this );      
}


public void onClick(View v) 
{
    Log.d( LOG_TAG, "onClick: 'Close' button pressed... Returning to calling activity." );
    setResult( RESULT_OK, (new Intent()).setAction("About activity has finished!") );

    finish();

    ComponentName cn = this.getCallingActivity();
    if ( cn != null )
    {
        Log.d( LOG_TAG, "onClick: calling activity = " + cn.getClassName() );
    }
    Log.d( LOG_TAG, "onClick: Activity is finishing? " + String.valueOf( this.isFinishing() ) );

    return;
}

Could somebody please explain to me why my main activity might be getting destroyed, and whether what I am doing is correct?

Thanks!