Android: 如何使一个 Activity 将结果返回给调用它的 Activity?

164

我有一个名为 Location 的活动,可以从许多活动中调用,例如注册订单活动。在Location活动中,用户输入他的位置,因此Location活动将把这个新位置返回给调用它的活动。

所以当注册活动调用Location活动时,它必须将数据返回给注册活动。另一次,订单活动也会做同样的事情。

注意

我知道你会告诉我应该发布代码,但我不是要求你给我代码;我只想要一些提示、链接或好的讨论。


你可以使用finish()函数来返回。 - Harshid
1
你有检查过StartActivityForResult吗?http://developer.android.com/reference/android/app/Activity.html - vinay kumar
@Harshid,你能否给我更多的细节信息,或者如果你有相关链接那就更好了。 - user user
5个回答

304
为了启动一个需要返回结果给调用方的活动,你应该像下面这样做。传递请求代码以便于识别你从启动的活动中获取到的结果。
startActivityForResult(new Intent(“YourFullyQualifiedClassName”),requestCode);

在此活动中,您可以使用setData()来返回结果。
Intent data = new Intent();
String text = "Result to be returned...."
//---set the data to pass back---
data.setData(Uri.parse(text));
setResult(RESULT_OK, data);
//---close the activity---
finish();

因此,在第一次活动中,您需要在onActivityResult()中编写以下代码:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == request_Code) {
        if (resultCode == RESULT_OK) {
            String returnedResult = data.getData().toString();
            // OR
            // String returnedResult = data.getDataString();
        }
    }
}

根据您的评论进行编辑: 如果您想返回三个字符串,则可以使用意图(intent)的键值对来实现,而不是使用Uri。

Intent data = new Intent();
data.putExtra("streetkey","streetname");
data.putExtra("citykey","cityname");
data.putExtra("homekey","homename");
setResult(RESULT_OK,data);
finish();

onActivityResult中获取它们,如下所示:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == request_Code) {
        if (resultCode == RESULT_OK) {
            String street = data.getStringExtra("streetkey");
            String city = data.getStringExtra("citykey");
            String home = data.getStringExtra("homekey");
        }
    }
}

你说什么?我不理解你的最后一条评论,抱歉我的英语不好,我正在尝试你的代码,requestcode是什么?我可以放任何整数吗? - user user
1
我说,没问题(NP),正如你所说,你可能会延迟实现这个功能,我回答说请按照自己的时间来完成,并在完成后评论,以便我得到通知。至于请求代码,是的,你可以给一个整数值,例如int requestCode = 1; - Kanth
是的,它可以正常工作,我接受了你的答案,非常感谢。我想问一下,是否有一种方法不仅可以发送字符串,而且可以发送3个字符串,比如“城市”,“街道”,“家庭”,有没有一种方法可以标记这些字符串? - user user
你的答案非常出色,如果你愿意的话,可以编辑标题,这样很多用户就能搜索到它了。 - user user
我正在寻找如何创建intent的方法:new Intent(this, OtherActivity.class); 我可以在一个Activity中使用这个代码。 - User
顺便说一下,onActivityResult实际上是受保护的,而不是公共的。尽管如此,这仍然是非常有帮助的答案。 - Mike Young

45

2021年2月更新:

Activity v1.2.0Fragment v1.3.0 中,引入了新的Activity Result APIs

Activity Result APIs 提供了用于注册结果、启动结果和处理系统分派的结果组件。

因此,不再需要使用 startActivityForResultonActivityResult

为了使用新的 API,在您的原始 Activity 中创建一个 ActivityResultLauncher,指定回调函数,该函数将在目标 Activity 完成并返回所需数据时运行:

private val intentLauncher =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->

        if (result.resultCode == Activity.RESULT_OK) {
            result.data?.getStringExtra("streetkey")
            result.data?.getStringExtra("citykey")
            result.data?.getStringExtra("homekey")
        }
    }

然后,每当需要时启动您的意图:

intentLauncher.launch(Intent(this, YourActivity::class.java))

为了从目标Activity返回数据,您只需添加一个带有要返回的值的intent到setResult()方法中:

val data = Intent()
data.putExtra("streetkey", "streetname")
data.putExtra("citykey", "cityname")
data.putExtra("homekey", "homename")

setResult(Activity.RESULT_OK, data)
finish()

如需任何其他信息,请参阅Android文档


1
请添加以下依赖项:implementation 'androidx.fragment:fragment-ktx:1.3.6' - Zohab Ali

5
如果你想在不返回数据的情况下完成操作并添加一个resultCode,你可以在finish()之前调用setResult(int resultCode)
例如:
...
if (everything_OK) {
    setResult(Activity.RESULT_OK); // OK! (use whatever code you want)
    finish();
}
else {
   setResult(Activity.RESULT_CANCELED); // some error ...
   finish();
}
...

然后在您的调用活动中,检查resultCode,以查看我们是否OK。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == someCustomRequestCode) {
        if (resultCode == Activity.RESULT_OK) {
            // OK!
        }
        else if (resultCode = Activity.RESULT_CANCELED) {
            // something went wrong :-(
        }
    }
}

不要忘记使用startActivityForResult(intent, someCustomRequestCode)来调用活动。


4
Activity.RESULT_OK的值实际上是-1,如果这让某些人感到困惑,我建议使用Activity常量。 - jacoballenwood

1
你的错误在于resultCode = Activity.RESULT_CANCELED,应该像这样实例化:resultCode == Activity.RESULT_CANCELED ==


2
你的回答可能有帮助,但由于原帖没有发布任何代码,所以不清楚它的指向。如果你是在评论另一个回答,你应该将你的评论直接发表在那个回答的评论区。 - Cheticamp

-1

嗨,
在我的情况下,我在回收器适配器中调用了finish()(在项目单击时)。
并且它在setResult(CODE, intent)之前被调用了。

如果上述所有方法都失败了,
请注释掉"finish();"并检查是否有其他地方调用了"finish();"。


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