在树上上下移动时,无法通过分层结构化活动获得活动结果

时间:2015-05-12 13:01:51

标签: android android-intent android-activity start-activity

我遇到了以下问题: 有活动A,B,C和D. B,C和D的每个活动都包含一个项目列表。

现在让我们从A开始: 从A我想去活动D选择一个项目并把它放在A的某个地方。 但要从A到D,我必须通过B和C. 这是因为B,C和D代表了一个对象树。

所以我按以下方式开始活动: A => B => C => d 最后我想将项目从D传递给A.

直到我的代码工作正常!

但: 想象一下,用户在活动C中选择了错误的项目。因此,他将在活动D中获得错误列表。 用户会做什么?用户将返回C,选择正确的项目,因此将显示D中的正确列表。 然后,用户将在D中选择想要的项目,该项目将被传递回活动A.

这不起作用。 因此,每当用户使用后退按钮在树中返回一个级别时,代码就不再起作用了。

具体来说它不起作用,因为如果我从D回到C,则活动C不再有调用Activity(actvityC.getCallingActivity()为null)。

从A到B我使用startActivityForResult()。 要从B到C,从C到D,我使用startActivity()和Intent.FLAG_ACTIVITY_FORWARD_RESULT。

我希望你能理解我的问题,并能帮助我。

问候

编辑:删除拼写错误

1 个答案:

答案 0 :(得分:0)

一个有趣的问题!

要解决此问题,您需要覆盖onBackPressed()中的ActivityD,如下所示:

@Override
public void onBackPressed() {
    Intent intent = new Intent(this, ActivityC.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
    // add any necessary extras here
    startActivity(intent);
}

您可能还需要覆盖onBackPressed()中的ActivityC,这样就可以回到ActivityB

然而......另一种可能更容易实现的替代方法是根本不使用startActivityForResult()。 A只能启动B. B可以启动C而C可以启动D,当用户实际选择D中的某些东西时,D可以直接将结果返回给A:

Intent intent = new Intent(this, ActivityA.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
// add whatever extras you want to send back to A
startActivity(intent);

这将从堆栈中删除活动D,C和B,并在onNewIntent()的现有实例上调用ActivityA

如果您需要将附加内容从A传递到B到C到D,您只需将它们添加到用于分别启动B,C和D的Intent

ActivityA中,您需要覆盖onNewIntent(),以便抓取Intent发回的ActivityD