onActivityResult() 在意料之外的时间被调用了。

4
在我的主活动中,我有以下内容:
    Intent settings_intent = new Intent(this, SettingsActivity.class);
    settings_intent.putExtra("SomeID", some_int);
    startActivityForResult(settings_intent, 1);

然后,在我的SettingsActivity中,我有:

@Override
public void onBackPressed() {
    super.onBackPressed();
    // pass back settings:
    Intent data = new Intent();
    data.putExtra("SomeThing", some_number);
    setResult(200, data);
    finish();
}

最后,我在我的主活动中重写了以下内容:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    makeToast("called");
    super.onActivityResult(requestCode, resultCode, data);
}

然而,我的“设置”活动刚开始时,“称为”的提示就已经出现了,而不是在活动完成时才出现。我已经花了很长时间来解决这个问题,感谢任何帮助。谢谢。
2个回答

14
很可能你的设置活动在清单文件中将其启动模式设置为singleTask。这会导致在调用startActivityForResult()时立即取消响应。
请注意,此方法仅适用于已定义返回结果的Intent协议。在其他协议(例如ACTION_MAIN或ACTION_VIEW)中,您可能无法在期望的时间获得结果。例如,如果您正在启动的活动使用了singleTask启动模式,则它将不会在您的任务中运行,因此您将立即收到取消结果。
来自startActivityForResult()文档

非常感谢您的回复。实际上,launchMode 设置为 "singleInstance",但它没有起作用。出于好奇,我在阅读了您的答案后将其更改为 android:launchMode="singleTask",令人惊讶的是它起作用了。但现在阅读文档,我担心它是否适用于其他设备。 - WSBT
我明白singleInstance也可能会导致这种情况,因为它几乎与singleTask相同。但说实话,我不知道为什么singleTask可以这样工作,所以我不能告诉你在其他设备上是否也是这样。 - user658042

-1
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode==1)
        makeToast("called");
    super.onActivityResult(requestCode, resultCode, data);
}

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