如何通过多个活动返回结果

时间:2012-02-03 21:03:54

标签: android android-activity android-intent handler

在我的应用程序的某些部分,有一个这样的活动结构:

enter image description here

Activity A是我的家庭活动,我会在每个流程或流程后回来 Activity B是一项简单的确认活动 Activity C是另一项确认活动 Activity D做了一些处理,最后将结果返回到我的家庭活动(Activity A)。

要求:

Activity BC

  • 必须在那里,不能合并为一个。
  • 当点击取消按钮时,它会调用finish()并且什么也不做。
  • 单击“确定”按钮时,它跟随流程并且当前活动调用finish()

问题:

我正在考虑使用startActivityForResult(),但我从未使用它来通过多个活动传递结果。
我还想传递一个handler(在Activity A中创建),在Activity A上调用某个方法并在Activity D上执行...
我怎么能实现呢?

4 个答案:

答案 0 :(得分:60)

您可能希望在启动活动B和C时使用意图标志 FLAG_ACTIVITY_FORWARD_RESULT ,如Intent中所述

  

public static final int FLAG_ACTIVITY_FORWARD_RESULT

     

自:API Level 1

     

如果设置并且此意图用于从现有活动启动新活动,则现有活动的回复目标将转移到新活动。这样,新活动就可以调用setResult(int)并将结果发送回原始活动的回复目标。

这样A应该收到从D

发回的额外内容中发回的任何数据

答案 1 :(得分:10)

是的,格式很棒。你可以 - 而且可能应该 - 肯定从活动A,B和C中调用startActivityForResult()(并且不要立即finish()。在B和C中,您可以检查成功的结果和finish(),将结果传回A。

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if((resultCode == RESULT_OK) && (requestCode == MY_RESULT_CODE)) {
        setResult(RESULT_OK, data);
        finish();
    }
}

如果您希望B和C消失,请执行以下操作:

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    setResult(resultCode, data);
    finish();
}

答案 2 :(得分:0)

我知道这是一个非常古老的问题,但我想提出一个有效的解决方案,使用onNewIntent()并将其视为onActivityResult()

在活动D中,您可以将您的意图构建为

Intent intent = new Intent(yourContext, Activity_A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("someName", data);
startActivity(intent);
finish();

然后在Activity_A

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // update your UI
    intent.getSerializableExtra(...
}

答案 3 :(得分:-1)

您可以将B和C作为从A触发的对话框进行操作,并且只有在B和C正常时,才能使用startActivityForResult()运行D