【问题标题】:Activity started with startActivityForResult() not returning to calling Activity以 startActivityForResult() 开始的活动不返回调用活动
【发布时间】:2012-03-13 17:29:08
【问题描述】:

我有 3 个活动 - ABC

简而言之,Activity A 启动 Activity B,然后 A 也启动 Activity C 并期望 C 得到结果,但从未得到它。

这是应用程序的工作流程:

  1. Activity A 在应用启动时启动,并在 onCreate 中启动 Activity B(不是为了结果,只是 startActivity())。

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startActivity(new Intent(getApplicationContext(), ActivityB.class));
    }
    
  2. Activity A 稍后也会在代码中启动 Activity C,这次使用 startActivityForResult() 获取结果,并且 Activity A 也有 onActivityResult。

    Intent intent = new Intent(getApplicationContext(), ActivityC.class);
    startActivityForResult(intent, 0);
    

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       ...
    }
    
  3. Activity C 使用 setResult() 和 finish() 返回一些数据,这些数据应该返回到 Activity A,因为 Activity A 调用了 startActivityForResult()。

    Intent intent = new Intent();
    intent.putExtra("encryption", encryption);
    setResult(56, intent);
    finish();
    

但是工作流程在第 3 步处于静默状态 - 活动 A 的 onActivityResult 从未被调用(B 也没有),即使活动 A 是结果的起始 C。不确定活动 B 是否妨碍了 A 和 C 的交流或问题可能是什么。非常感谢任何帮助。

【问题讨论】:

  • 好难理解....Activity B然后使用Activity A进行web服务调用,如果Activity A判断需要登录,就启动Activity C
  • 已编辑问题以简化问题。基本上 Activity A 启动 Activity B,然后 A 也启动 Activity C 并希望从 C 获得结果,但从未得到它。
  • startActivityforresult 进入 B 活动它的工作你从哪个活动开始并返回 onactivityresult
  • 我在A中调用startActivity启动B,在A中调用startActivityForResult启动C,所以C应该返回结果给A。
  • 你肯定会在 A 中给出 onActivityResult 方法

标签: android android-activity


【解决方案1】:

我一直无法让它工作,所以我最终使用 Handler 来将数据返回到必要的 Activity。

更新:再次遇到此问题后,我发现这不起作用的真正原因是因为清单中的调用/接收活动 A 有 android:noHistory="true"。删除 android:noHistory="true" 修复了它,但如果您需要它是真的,那么处理程序是一个很好的解决方法。

【讨论】:

  • 谢谢!我不知道为什么 onActivityResult 没有被调用,这就是原因。我记录了一个 Android 文档问题 code.google.com/p/android/issues/detail?id=68137
  • @Vicki 13 个月后,这个问题仍然显示为“新”。不知何故,Android 在很多领域都被吸干了。文档当然是其中之一。
【解决方案2】:

我认为您不应该在意图中使用getApplicationContext()

来自开发者网站。

getApplicationContext()
Return the context of the single, global Application object of the current process.

当您startActivityForResult() 时,它会尝试返回到您作为全局应用程序上下文提供的意图中指定的活动。

如果你有一个 ActivityB 那么你应该这样称呼它

Intent intent = new Intent(ActivityB.this, ActivityC.class);
startActivityForResult(intent, 0);

然后它会在ActivityC完成后尝试返回ActivityB。

【讨论】:

  • 我以为返回结果的activity是调用startActivityForResult()的activity,而不是创建Intent时指定的Context。无论如何,按照您指定的方式更改它仍然没有将结果返回给 onActivityResult。
  • 澄清,如果最后2行代码是从ActivityB调用的。 ActivityC 启动然后返回到 ActivityB,它不会更多地回答您原来的问题,以说明创建意图时要使用的正确参数。也许在开始活动的地方添加更完整的代码示例可能会有所帮助。
  • 在我的场景中,您的最后两行代码是从 Activity A 调用的,这是我希望将结果返回到的地方。但这并没有发生,我唯一能确定的是这是因为 Activity A 也首先启动了 Activity B。
  • 您是说从 ActivityA 启动 ActivityB,然后在从 ActivityA 启动 ActivityC 之后立即启动?
  • 是的。 Activity B用startActivity启动,C用startActivityForResult启动,因为我想让A得到C的结果。
【解决方案3】:

你可以试试这个:

if (getParent() == null) {
setResult(RESULT_OK, dataTobePassback);
} else {
getParent().setResult(RESULT_OK, dataTobePassback);
}

dataTobePassback 是一个 Intent,它携带您可能需要传回调用活动的内容

【讨论】:

  • 知道为什么/如何工作会很有趣。
猜你喜欢
  • 2016-08-21
  • 1970-01-01
  • 2012-10-17
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多