onActivityResult不起作用?

18

我遇到了一个与 startActivityForResult() 相关的问题。

要从 FirstActivity 启动 SecondActivity:

Intent intent = new Intent();
intent.setClass(FirstActivity.this, SecondActivity.class);
intent.putExtra("key1", "12345");
startActivityForResult(intent, 0);

并处理结果:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //TODO handle here. 
}

向FirstActivity发送消息的方法:

在SecondActivity中:

setResult(0);

我无法处理FirstActivity的onActivityResult结果,在我的应用程序中从未成功过。

我的操作系统是:1.5

这里出了什么问题?


当您完成第二个活动时会发生什么?onActivityResult() 回调方法会被调用吗? - Samuh
谢谢您的回复,我想让第二个活动保持打开,同时第一个活动被关闭。这是否可能? - AndroiDBeginner
6个回答

30

startActivityForResult 通常用于选择数据或执行某些无法由你的Activity或应用程序完成的动作。

例如,您想选择联系人,因此启动联系人应用程序,用户选择他们想要的人,然后将结果发送给您。或者您想拍照,所以启动相机应用程序并要求它在完成后向您发送照片。此操作与调用 startActivityForResult 的第一个活动完全分离。

启动的 Activity 直到该 Activity 完成,即调用了 finish(),才会将结果发送给您。

因此,在您的情况下,您需要在 SecondActivity 中调用此函数:

setResult(...);
finish();

FirstActivityonActivityResult方法中才能接收到结果。这意味着SecondActivity已经关闭,FirstActivity重新成为栈顶。


不可能在保持SecondActivity处于活动状态的情况下,发送结果并关闭FirstActivity。在这种情况下,你应该在SecondActivity中处理任何“结果”,或将其发送到你定义的Service中处理。


我在我的代码中遇到了一些问题... onActivityResult 没有被调用...最后发现我使用的是 startActivity(newIntent); 而不是 setResult(resultCode,intent);...感谢这篇文章... - rahul

19

我曾经被卡在这里了一段时间。将我的问题放在这里,以确保您不需要再思考。

该函数的第二个参数必须为0或更高。

startActivityForResult(intent, 0); // <- this is OK

我将第二个参数设置为 RESULT_OK (-1),但是我的 onActivityResult 回调函数从未被调用。所以如果你像我一样卡住了,也可以检查一下你的第二个参数是否正确。

startActivityForResult(intent, RESULT_OK); // <- this is wrong

上述代码将无法调用onActivityResult方法。


7

我也遇到了同样的问题,但原因与matangs不同。显然,只有在主活动(在清单中)设置为standard时,startActivityForResult才能正常工作。希望对某些人有所帮助。


从活动中删除启动模式也解决了我的问题...谢谢 - TrueCoke

5
你的代码看起来没问题,但是你有停止第二个活动吗?
你可以在其中试试这个:
setResult(0);
finish();

谢谢您的回复,我正在尝试让第二个活动保持运行,同时第一个活动将被关闭。这是否可能? - AndroiDBeginner
抱歉我的英语不好。我正在尝试实现以下功能:当在FirstActivity中调用setResult(MY_RESULT)时,我希望能够在onActivityResult中处理它。然后结束FirstActivity,例如:FirstActivity.this.finish();如何实现? - AndroiDBeginner
如果你想在获取SecondActivity的结果后结束FirstActivity,你当然也可以在FirstActivity上执行finish()。 - tbruyelle
setResult(0) 会导致失败的结果。我认为结果应该是正数。 - GrkEngineer

1
如果您在onPause上执行操作(如取消绑定服务),请尝试进行注释并查看是否调用了onActivityResult(我在这方面浪费了几个小时..)。

0
感谢 @johndodo(指向清单文件)- 我找到了解决相同问题的方法。
在清单文件中删除 android:noHistory=true 解决了我的问题。

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