当BACKbutton被按下时,setResult不起作用

我正在按BACKbutton后尝试setResult。 我打电话给onDestroy

Intent data = new Intent(); setResult(RESULT_OK, data) 

但是当涉及到

 onActivityResult(int requestCode, int resultCode, Intent data) 

resultCode为0(RESULT_CANCELED),数据为'null'。

那么,我怎样才能通过返回button终止活动的结果呢?

您需要覆盖onBackPressed()方法并在调用超类之前设置结果,即

 @Override public void onBackPressed() { Bundle bundle = new Bundle(); bundle.putString(FIELD_A, mA.getText().toString()); Intent mIntent = new Intent(); mIntent.putExtras(bundle); setResult(RESULT_OK, mIntent); super.onBackPressed(); } 

finish()被调用之前,必须设置Activity结果。 点击BACK实际上会在你的activity调用finish() ,所以你可以使用下面的代码片段:

 @Override public void finish() { Intent data = new Intent(); setResult(RESULT_OK, data); super.finish(); } 

如果您调用NavUtils.navigateUpFromSameTask();onOptionsItemSelected()finish()被调用,但是你会得到错误的result code 。 所以你必须在onOptionsItemSelected()调用finish()而不是navigateUpFromSameTask 。 onActivityResult中的错误requestCode

如果你想在onBackPressed事件中设置一些自定义的RESULT_CODE ,那么你需要先设置result ,然后调用super.onBackPressed() ,你将在调用者的activity的onActivityResult方法中得到相同的RESULT_CODE

  @Override public void onBackPressed() { setResult(SOME_INTEGER); super.onBackPressed(); } 

我重构了我的代码。 最初我准备了一些数据,并将其设置为onDestroy activity result (这不起作用)。 现在我每次要更新返回的数据都设置activity数据,而在onDestroy什么也没有。

请参阅ActivityResult(int,int,Intent)doc

解决方法是检查resultCode的值Activity.RESULT_CENCELED 。 如果是,则意味着按下BACK或者活动崩溃。 希望它适用于你们,为我工作:)。

你应该重写onOptionsItemSelected像这样:

 @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { case android.R.id.home: final Intent mIntent = new Intent(); mIntent.putExtra("param", "value"); setResult(RESULT_OK, mIntent); finish(); return true; default: return super.onOptionsItemSelected(item); } } 

onDestroy在链中已经太迟了 – 而是重写onPause并检查isFinishing()来检查你的活动是否在其生命周期结束。

尝试重写onBackPressed(从android级别5起),或​​重写onKeyDown()并捕获KeyEvent.BUTTON_BACK(请参阅Android活动结果 )这对我来说是诀窍。

当您返回到初始状态时,不要依赖在一个活动的onPause中执行的任何逻辑。 根据文件:

这个方法的实现(onPause)必须非常快,因为在这个方法返回之前,下一个活动不会被恢复

有关详细信息,请参阅http://goo.gl/8S2Y

最安全的方法是在每个结果更改操作完成后设置结果(如您在答案中所述)

我贴的答案可能会对其他人有所帮助:当一个set的launcheMode与android:launchMode =“singleTask”我也不能得到结果,文档说:

  /* <p>Note that this method should only be used with Intent protocols * that are defined to return a result. In other protocols (such as * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may * not get the result when you expect. For example, if the activity you * are launching uses the singleTask launch mode, it will not run in your * task and thus you will immediately receive a cancel result. */ 

和:

  /* <p>As a special case, if you call startActivityForResult() with a requestCode * >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your * activity, then your window will not be displayed until a result is * returned back from the started activity. This is to avoid visible * flickering when redirecting to another activity. */