Android finishActivity总是导致onActivityResult获得RESULT_CANCELED

时间:2010-11-10 22:30:44

标签: android android-activity

我有一个主要的活动A可以启动子活动B,C或D.我使用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,DI只设置了该结果,如果用户选择按下后退按钮(我显示“你确定”对话框,他们选择退出。在B,C,DI在onPause中有以下内容.userExiting是我在Exit对话框中设置的标志。

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之后,由于结果从未设置,因此活动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);
 }

1 个答案:

答案 0 :(得分:2)

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

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

你在某种程度上试图将Activity A用作控制器,让它完成其他活动。不要这样做。每个活动都应该负责在适当的时候完成自己。

如果你想拥有A - >堆栈上的B到A - > C,然后我会这样做:

A为结果启动B.当用户在B中选择要求转到C的内容时,您有一些选择。你可以让B开始C不是为了结果,然后完成。当C退出时,这将具有从堆栈中移除B的效果。或者,你可以让B完成自己,传回一个注释,应该在结果意图中加载C.然后A可以加载C以获得结果。

我真的不确定你为什么要这种行为。作为Android用户,如果我选择A - > B - > C,我希望回击再把我带回B.

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