Android 即使子活动执行setResult()和finish(),也不会调用主活动中的onActivityResult

Android 即使子活动执行setResult()和finish(),也不会调用主活动中的onActivityResult,android,Android,我编写了一个简单的应用程序,它有一个“关于”屏幕(活动),当用户从主活动中选择选项菜单中的“关于”项时,屏幕上会显示该屏幕。“关于”屏幕上有一个名为“关闭”的按钮 我想要的行为是,当用户单击“关闭”按钮时,她/他应该被带到上一个活动(即启动About活动的活动)。为此,我使用startActivityForResult()从主活动(TFT)启动About活动(TFTAbout)然后在TFTAbout.java中,我调用setResult()和finish(),当我单击“关闭”时,这将依次调用主活

我编写了一个简单的应用程序,它有一个“关于”屏幕(活动),当用户从主活动中选择选项菜单中的“关于”项时,屏幕上会显示该屏幕。“关于”屏幕上有一个名为“关闭”的按钮

我想要的行为是,当用户单击“关闭”按钮时,她/他应该被带到上一个活动(即启动About活动的活动)。为此,我使用
startActivityForResult()从主活动(TFT)启动About活动(TFTAbout)
然后在
TFTAbout.java
中,我调用
setResult()
finish()
,当我单击“关闭”时,这将依次调用主活动中的
onActivityResult()

实际上,当我单击“关闭”时,不会调用主活动(TFT)

从日志中可以看出,活动TFTABOT确实执行了
setResult()
finish()
。然而,在这一点上,onDestroy被称为主要活动。因此,我的猜测是,由于没有要返回的启动活动,
onActivityResult()
没有被调用。 我说得对吗


请参考下面的Logcat输出(无时间戳以提高可读性):


下水作业代码(TFT):

已启动活动的代码(关于):


有人能给我解释一下为什么我的主要活动可能会被破坏,以及我所做的是否正确吗?

我也有同样的问题。在我的例子中,我通过更改AndroidManifest.xml文件中的一行来解决这个问题

请看


我希望这能解决您的问题。

我决定用一个简单的对话框来代替额外的活动。这完全符合我的目的,无需处理新的活动。我第一次就应该试试这个。无论如何,谢谢你。如果有人有任何建议,请添加评论。
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
@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." );
    }
} 
@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;
}