按下BACK按钮时,setResult不起作用

时间:2010-04-20 22:53:17

标签: android

我按下BACK按钮后尝试setResult。我打电话给onDestroy

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

但是谈到

onActivityResult(int requestCode, int resultCode, Intent data) 

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

那么,如何通过BACK按钮终止的活动传递结果?

10 个答案:

答案 0 :(得分:147)

你需要覆盖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();
}

答案 1 :(得分:64)

Activity结果必须在调用 finish()之前设置为。点击后退实际上会在finish()上调用activity,因此您可以使用以下代码段:

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

    super.finish();
}

如果您在NavUtils.navigateUpFromSameTask();中致电onOptionsItemSelected(),则会调用finish(),但您将收到错误的result code。因此,您必须在finish()中致电navigateUpFromSameTask而不是onOptionsItemSelected()wrong requestCode in onActivityResult

答案 2 :(得分:16)

如果您想在RESULT_CODE事件中设置一些自定义onBackPressed,则需要先设置result,然后调用super.onBackPressed(),您将收到相同的RESULT_CODE调用者活动的onActivityResult方法

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

答案 3 :(得分:9)

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

答案 4 :(得分:3)

参考onActivityResult(int, int, Intent) doc

解决方法是检查 resultCode 的值 Activity.RESULT_CENCELED 。如果是,则表示按下了BACK或活动崩溃。希望它适合你们,为我工作:)。

答案 5 :(得分:3)

您应该覆盖 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);
    }
}

答案 6 :(得分:0)

onDestroy在链中太晚了 - 而是覆盖onPause并检查isFinishing()以检查您的活动是否处于其生命周期的末尾。

答案 7 :(得分:0)

尝试覆盖onBackPressed(从android级别5开始),或覆盖onKeyDown()并捕获KeyEvent.BUTTON_BACK(参见Android Activity Results) 这对我有用。

答案 8 :(得分:0)

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

  

此方法的实现(onPause)必须非常快,因为   在此方法返回

之前,不会恢复下一个活动

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

最安全的方法是在每次结果更改操作完成后设置结果(正如您在答案中提到的那样)

答案 9 :(得分:0)

我粘贴答案可能对其他人有帮助: 当一个设置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. 
 */