【问题标题】:Android finishActivity always causing onActivityResult to get RESULT_CANCELEDAndroid finishActivity 总是导致 onActivityResult 得到 RESULT_CANCELED
【发布时间】:2011-09-05 23:34:56
【问题描述】:

我有一个可以启动子活动 B、C 或 D 的主活动 A。我使用 startActivityForResult(newIntent, REQUEST_CODE); 启动它们;

一旦显示,用户可以选择在 B、C 和 D 之间导航。活动 A 控制该导航。当他们选择屏幕“A”之间的交换时,首先调用 finishActivity(REQUEST_CODE);在显示的那个上,然后调用 startActivityForResult(newIntent, REQUEST_CODE);下一个。

在我的 onActivityResult 我有

    protected void onActivityResult(int requestCode, int resultCode, Intent data)
   {
      // these logs are just for my debugging
      Log.w(this.toString(), "onActivityResult returned to by " + requestCode);
      Log.w(this.toString(), "result code = " + resultCode );

      // the Activity set this value if it was returning normally
      if (RESULT_OK == resultCode)
      {
         Log.i(this.toString(), "---- the sub-activity returned OK ----"); 
         // do some stuff    

      }// end if (RESULT_OK == resultCode)
      // Else we got here because the user hit the back button or something went
      // went wrong (RESULT_CANCELED).  Either way we do not want to display this
      // blank screen to the user.  Take them back to the device connection screen.
      else if (RESULT_CANCELED == resultCode)
      {    
         finish();
      }
    }

由于某种原因,我每次都返回零或 RESULT_CANCELED,即使在我的子活动 B、C、D 中,我只在用户选择点击后退按钮时才设置该结果(我显示“你确定吗”对话框,他们选择退出。在 B、C、D 中,我在 onPause 中有以下内容。userExiting 是我在退出对话框中设置的标志。

protected void onPause()
   {
      Log.i(this.toString(), "onPause");

      // hack to try to setResult for an activity whose finishActivty was called
      if ( !this.exiting ) 
      {
         Log.i(this.toString(), "======== RESULT_OK ========"); 
         Intent returnIntent = new Intent();
         setResult(RESULT_OK, returnIntent);
         finish();
      }

      displayed = false;

      super.onPause();
   }

有什么想法吗?

编辑 - 要明确的问题是,在旧 Activity 上调用 finishActivty 后,由于从未设置结果,Activity A 总是认为它应该退出。一个奇怪的副项目。直到用户导航两次才会发生这种情况。换句话说,B 被显示并且他们选择去 C. Works,但我可以在日志中看到 onActivityResult 没有被调用。用户选择从 C 到 D,繁荣,我看到两个对 onActivtyResult 的调用,'A;退出并显示 D 并且用户无法导航。

更新:由于这已经获得了很多意见,我想我会发布此更新。该项目演变为有时显示单个活动,有时显示一个组作为选项卡。在某些情况下,当用户退出选项卡时,需要将数据返回到启动选项卡的 Activity。在我添加 RESULT_CANCELED 下面的代码之前,总是会返回。还要确保在完成之前调用 setResult。

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

【问题讨论】:

  • 顺便说一句,您确定在返回活动时确实需要显示“您确定”对话框吗?我会觉得这真的很烦人。相反,您应该让用户轻松回到原来的位置。
  • 在我的情况下,我的要求不是让他们回到原来的位置,而是在他们按下后退出,在我们让“你确定”对话框用户意外退出之前。一旦他们离开 A 并前往 B、C 和 D,他们就再也不会回到 A。
  • 哦,那可能是因为这不是后退按钮的预期行为。如果我在一个屏幕上,我会移动到一个新屏幕,然后回击我希望回到前一个屏幕。如果你遵循人们所期望的范式,你就会遇到更少的问题。

标签: android android-activity


【解决方案1】:

我并没有完全关注你在这里所做的一切,但听起来你在活动之间导航并不正确。我强烈建议您通读notepad example,以便您了解在活动之间移动的android 方式。

以下是我对您要完成的任务的理解:活动 A 可以导航到 B、C 或 D。您可以从 B、C 或 D 导航到其他任何一个。

您以某种方式尝试将 Activity A 用作控制器,让它完成其他 Activity。不要这样做。每个活动都应该负责在适当的时间完成自己。

如果您想从堆栈中的 A -> B 变为 A -> C,那么我会这样做:

A 开始 B 的结果。当用户在 B 中选择某项要求转到 C 时,您有几个选择。你可以让 B 开始 C 不是为了结果,然后结束。当 C 退出时,这将产生 B 从堆栈中删除的效果。或者,您可以让 B 自行完成,并返回一条说明 C 应加载到结果意图中的注释。然后 A 可以加载 C 以获得结果。

我真的不确定你为什么想要这种行为。作为 Android 用户,如果我从 A -> B -> C 出发,我希望回击将我带回 B。

顺便说一句,您的“正在退出”黑客没有任何意义。当你到达 onPause 时,结果已经设置好了。你不能在这里改变它。您需要在完成时正确设置结果,在 onPause 之前。

【讨论】:

  • 感谢您的回复。我还没有完成记事本示例,但现在会这样做。你是对的,我使用“A”作为控制器(可能不正确,如果系统杀死它,我就有麻烦了)。我听到你说的退出和返回按钮,但这是我必须忍受的要求。棘手的问题是我的应用程序正在与服务器协调,因此 C 只能间接导航到 D。尽管它对用户看起来是透明的。当用户选择从 C 到 D 时,C 向服务器发送这样做的请求。如果服务器响应 OK,A 实际上会收到该消息并告诉 D 开始。
  • 然后 A 在 C 上调用 finshActivity。出于某种原因,我还没有弄清楚我没有立即回叫 onActivtyResult。当我这样做时,我总是回到 0。我什至尝试覆盖 onFinish 并设置 RESULT_OK。但由于某种原因,我没有看到 onFinish 受到打击。当我突然导航到 2 个不同的屏幕后第一次发布这个问题时,我都会返回 0。然后我调用了 finishActivity,然后调用了 startActivityForResult。我现在已经交换了它,并且可以多次导航 B、C、D 而没有返回,我按了返回按钮,确定退出,然后它们都进来了
  • 是否可以保留 Activity 以防止其完成?
  • 我认为您建议删除 A 作为控制器是票。有一次我将 ifo 传回给 A,但我现在没有,所以为什么不使用 start、fire and forget 来从 B 启动 C,然后让 B 自己完成。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 2019-08-28
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多