【问题标题】:Launching an ActivityForResult from Activity A with createChooser Intent I want to finish Activity A but not when the user presses the back button使用 createChooser Intent 从 Activity A 启动 Activity For Result 我想完成 Activity A 但不是在用户按下后退按钮时
【发布时间】:2012-06-08 17:06:38
【问题描述】:

所以我在活动 A 中有这个:

startActivityForResult(Intent.createChooser(share, "Share using"), 0);

它启动一个选择器以使用 Activity B 共享某些内容。当 Activity B 完成时,我希望 Activity A 也完成:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent){
    super.onActivityResult(requestCode, resultCode, intent);

    this.finish();

}

问题是当用户在选择器打开时按下后退按钮时,活动 A 完成......我不希望发生这种情况。我曾尝试覆盖 Activity A 中的 onBackPressed 方法,但这似乎在选择器打开时不适用。请帮帮我。

更新:我应该提到活动 B 不在我的控制之下,是用户决定与之共享的任何内容。

更新 2:问题是选择器活动和用户从选择器中选择的活动被认为是相同的活动,因此当用户关闭活动 B(用于共享文本的活动)时,onActivityResult 会得到与选择器活动中的结果代码和请求代码相同。必须有办法解决这个问题,但我想不出。

【问题讨论】:

  • 从您的方法中删除 this.finish()
  • 为什么?我希望活动 A 在活动 B 完成时完成。
  • method si called when intent finished from your code i don't know, which type of intent/action you want to do, you created intent like createChooser so when chooser is closed, method onAcivityResult is called and你的活动 A 也是。所以这种做法是不对的。
  • 你有没有想过这个问题?
  • 我没有。我最终只使用了 startActivity()。不是我想要的确切行为,但不是太大的交易......至少在我的情况下。

标签: android android-activity android-intent share activity-finish


【解决方案1】:

你应该在调用之前测试返回requestCode和resultCode是什么

this.finish();

这样,如果用户在选择某项之前按下返回按钮,您的活动 A 将不会被破坏。

【讨论】:

  • 您的建议不起作用,因为当用户按下后退按钮和用户完成 Activity B 时 requestCode 和 resultCode 的值是相同的。我应该提到 Activity B 不在我的控制之下并且是用户决定分享的任何内容。
  • resultCode是系统提供的处理情况的方式。如果用户在选择之前放弃,选择器应该返回给您 RESULT_CANCELED。如果您无法控制的其他应用程序在实际成功时向您返回 RESULT_CANCELED(例如 RESULT_OK),那么我认为您将无能为力。但我认为在大多数情况下,使用 if 语句检查 resultCode 将是您解决这种情况的方式。你能举出你观察到它不正常的具体例子吗? (即返回不正确的代码)
  • 当用户在选择器打开的情况下按下后退按钮时会发生唯一不正确的行为(活动 A 在我不希望的情况下完成)。由于 Activity B 不在我的控制之下,我不知道它返回的 resultCode 是什么。从测试中我知道,例如,如果我使用 Facebook 或 Twitter 应用程序共享然后关闭应用程序,resultCode 为 0。这是可以理解的,因为这些应用程序的开发人员决定在应用程序共享某些内容或完成时不发送 resultCode .
【解决方案2】:

您需要检查它是 a) 正确的活动和 b) 正确的结果代码。您的 onActivityResult 应如下所示:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent intent){
    super.onActivityResult(requestCode, resultCode, intent);

    if (requestCode == 0) {
        if (resultCode == RESULT_OK) {
           this.finish();
        }
    }
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多