SetResult не работает, когда нажата кнопка BACK

Я пытаюсь setResult после нажатия кнопки BACK. Я звоню в onDestroy

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

Но когда дело доходит до

onActivityResult(int requestCode, int resultCode, Intent data) 

resultCode равен 0 (RESULT_CANCELED), а данные - "null".

Итак, как я могу передать результат из операции, завершенной кнопкой BACK?

Ответ 1

Я реорганизовал свой код. Сначала я подготовил некоторые данные и установил их как activity result в onDestroy (это не сработало). Теперь я устанавливаю данные activity каждый раз, когда данные, которые будут возвращены, обновляются и не имеют ничего в onDestroy.

Ответ 2

Вам нужно переопределить метод onBackPressed() и установить результат перед вызовом суперкласса, i.e

@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();
}

Ответ 3

Activity результат должен быть установлен , прежде чем finish() вызывается. Нажатие кнопки BACK фактически вызывает finish() на вашем Activity, поэтому вы можете использовать следующий фрагмент:

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

    super.finish();
}

Если вы вызываете NavUtils.navigateUpFromSameTask(); в onOptionsItemSelected(), вызывается finish(), но вы ошибетесь result code. Поэтому вы должны называть finish() not navigateUpFromSameTask в onOptionsItemSelected(). неверный запросКод в onActivityResult

Ответ 4

Если вы хотите установить какое-то пользовательское событие RESULT_CODE in onBackPressed, тогда вам нужно сначала установить result, а затем вызвать super.onBackPressed(), и вы получите тот же RESULT_CODE в активности вызывающего абонента onActivityResult метод

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

Ответ 5

Обратитесь onActivityResult (int, int, Intent) doc

Решение - проверить resultCode на значение Activity.RESULT_CENCELED. Если да, то это означает, что нажата кнопка BACK или произошел сбой активности. Надеюсь, он работает для вас, ребята, работает для меня:).

Ответ 6

Вы должны переопределить 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);
    }
}

Ответ 7

onDestroy слишком поздно в цепочке; вместо этого переопределите onPause и проверьте isFinishing(), чтобы проверить, находится ли ваша активность в конце жизненного цикла.

Ответ 8

Попробуйте переопределить onBackPressed (с уровня Android 5 вверх) или переопределить onKeyDown() и поймать KeyEvent.BUTTON_BACK (см. Результаты активности Android) Это делает трюк для меня.

Ответ 9

Не полагайтесь на какую-либо логику, выполняемую в onPause одного действия при возврате к исходному. Согласно документам:

Реализации этого метода (onPause) должны быть очень быстрыми, потому что следующее действие не будет возобновлено до тех пор, пока этот метод не вернет

Подробнее см. http://goo.gl/8S2Y.

Самый безопасный способ - установить результат после завершения каждой операции изменения результата (как вы упомянули в своем ответе)

Ответ 10

Вставьте ответ, возможно, будет полезно другим людям: когда набор запускается с помощью 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. 
 */