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

49

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

enter image description here

活动A是我的主页活动,在每个流程或过程之后都会返回到该活动。
活动B是一个简单的确认活动。
活动C是另一个确认活动。
活动D执行一些处理,最终将结果返回到我的主页活动(活动A)。

要求:

活动BC:

  • 必须存在,不能合并。
  • 如果点击取消按钮,则调用finish()并不执行任何操作。
  • 如果点击确定按钮,则按流程进行,当前活动调用finish()

问题:

我正在考虑使用startActivityForResult(),但我从未使用过它来通过多个活动传递结果..
我还在考虑传递一个handler(在活动A中创建),它调用活动D上的某个方法,并在活动A上执行...

如何实现?


我也遇到了两个具有多个活动的应用程序的上述问题。如果可能,请参考并回复http://stackoverflow.com/questions/38735674/how-to-get-data-onactivityresult-from-external-app-activity-using-seresult-or-st/38736824# - harikrishnan
4个回答

65
你可能希望使用 FLAG_ACTIVITY_FORWARD_RESULT 意图标记,如 Intent 中所述,当启动B和C活动时。

public static final int FLAG_ACTIVITY_FORWARD_RESULT

自API级别1起

如果设置了这个意图, 并且正在使用它来从一个现有的活动启动一个新的活动,那么现有活动的回复目标将被传输到新的活动。 这样,新活动可以调用setResult(int)并将该结果发送回原始活动的回复目标。

这样,A应该在extras中接收到从D返回的任何数据。

14
只有在中间的Activity都已经调用了finished()方法时,这种方法才会奏效。如果B或C没有调用finished()方法,A的onActivityResult()方法就不会被调用。使用startActivityForResult()和onActivityResult()方法进行链接可以在中间的Activity是否已完成的情况下都奏效。 - James Wald
很好用!感谢分享。在包含标志的意图调用startActivity()后,我finish()了中间活动。 - raultm
我也遇到了两个具有多个活动的应用程序的上述问题。请参考并回复..http://stackoverflow.com/questions/38735674/how-to-get-data-onactivityresult-from-external-app-activity-using-seresult-or-st/38736824# - harikrishnan

11

没错,格式很棒。你可以在Activity A、B和C中分别调用startActivityForResult()(而且可能应该这么做),并且不要立即调用finish()。在B和C中,您可以检查是否成功返回了结果,并将结果传递回A,然后再调用finish()

    @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();
}

这个实现是正确的,但我真的需要那些活动消失(以防止后退按钮按下)。在我的情况下,按照@NickT所描述的方式实现更容易。 - jalv1039
你如何确定Activity B是使用哪个“requestCode”启动的?我从A启动B时使用了几个请求代码(例如,如果我想修改或添加新条目,则是相同的Activity B,但具有不同的请求代码)。 那么,我如何从Activity B启动Activity C的startActivityForResult呢? - OroshiX

1
我是一名有用的助手,可以为您翻译文本。

我知道这是一个非常古老的问题,但我想提供一个有效的解决方案,使用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(...
}

-2

你可以将B和C作为从A触发的对话框,只有当B和C都OK时,才使用startActivityForResult()运行D。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接