Android:如何使活动返回结果给调用它的活动?

Posted

技术标签:

【中文标题】Android:如何使活动返回结果给调用它的活动?【英文标题】:Android: how to make an activity return results to the activity which calls it? 【发布时间】:2013-01-25 00:00:18 【问题描述】:

我有一个Location 活动,可以从许多活动中调用,例如Sign upOrder。在Location 活动中,用户输入了他的位置,因此Location 活动会将这个新位置返回给调用它的活动。

所以当Sign up活动调用Location活动时,它必须将数据返回给Sign up活动。另一次Order 活动将做同样的事情。

注意

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

【问题讨论】:

你可以使用finish() 调用返回.. 你检查 StartActivityForResult developer.android.com/reference/android/app/Activity.html @Harshid 请给我更多详细信息,或者如果您有链接将不胜感激 【参考方案1】:

2021 年 2 月更新

与Activity v1.2.0 和Fragment v1.3.0 一样,引入了新的Activity Result APIs

活动结果 API 提供了用于注册结果、启动结果以及在系统分派结果后处理结果的组件。

所以不再需要使用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 返回数据,您只需添加一个带有返回值的意图即可返回到 setResult() 方法:

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

setResult(Activity.RESULT_OK, data)
finish()

如需更多信息,请参考Android Documentation

【讨论】:

为此,您必须添加此依赖项implementation 'androidx.fragment:fragment-ktx:1.3.6'【参考方案2】:

你的错误在resultCode = Activity.RESULT_CANCELED,你应该像resultCode == Activity.RESULT_CANCELED一样实例化==

【讨论】:

您的回答可能会有所帮助,但由于 OP 没有发布任何代码,因此尚不清楚它的指向。如果您正在评论另一个答案,您应该将您的 cmets 引导到该答案的评论部分。【参考方案3】:

如果您想完成并只添加一个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,看看我们是否正常。

@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) 调用活动。

【讨论】:

Activity.RESULT_OK 的值实际上是-1,以防混淆。我只是建议使用Activity 常量【参考方案4】:

为了启动应该将结果返回给调用活动的活动,您应该执行以下操作。您应该传递如下所示的请求代码,以识别您从开始的活动中获得了结果。

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

根据您的评论进行编辑: 如果您想返回三个字符串,请按照意图使用键/值对而不是使用 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 是什么,我可以输入任何整数吗? 我说,没问题(NP),正如你所说,你可能迟到了,我回答说要花点时间,然后发表评论,以便我得到通知。来到 requestcode,是的,你可以给出一个整数值,比如 int requestCode = 1; 是的,它是正确的,我接受你的回答,非常感谢你,我想问你是否有办法不只是发送字符串,我想发送 3 个字符串,比如“ city”、“street”、“home”,有没有办法给字符串打标签? 你的答案非常好,如果你愿意,编辑标题让更多用户可以搜索到它 我正在寻找如何create the intent: new Intent(this, OtherActivity.class); 我可以在活动中使用此代码。

以上是关于Android:如何使活动返回结果给调用它的活动?的主要内容,如果未能解决你的问题,请参考以下文章

服务如何将结果返回给活动

Android:setResult 未将结果返回给父 Activity

Android:从片段调用时如何从活动中获取返回结果?

如何在 Android 上管理 startActivityForResult?

Android Kotlin 无法从另一个活动中获取结果

如何在当前活动中将搜索结果保存在 ListView (Android) 中