Как вернуть результат через несколько действий - PullRequest
47 голосов
/ 04 февраля 2012

в какой-то части моего приложения есть такая структура действий:

enter image description here

Activity A - это моя домашняя деятельность, к которой я возвращаюсь после каждого процесса или потока.
Activity B - это простая операция подтверждения.
Activity C является еще одним подтверждением активности.
Activity D выполняет какой-то процесс и, наконец, возвращает результат моей домашней деятельности (Activity A).

Требования:

Activity B и C:

  • должен быть там и не может быть объединен в один.
  • при нажатии на кнопку отмены он вызывает finish() и ничего не делает.
  • при нажатии на кнопку ОК он следует за потоком, и текущая активность вызывает finish()

Вопрос:

Я думал об использовании startActivityForResult(), но я никогда не использовал его для передачи результата через несколько действий ..
Я также думал передать handler (созданный в Activity A), который вызывает некоторый метод на Activity A и выполняется на Activity D ...

Как я мог это реализовать?

Ответы [ 4 ]

60 голосов
/ 04 февраля 2012

Возможно, вы захотите использовать флаг намерения FLAG_ACTIVITY_FORWARD_RESULT , как описано в Intent при запуске действий B и C

публичный статический финал int FLAG_ACTIVITY_FORWARD_RESULT

С: Уровень API 1

Если установлено и это намерение используется для запуска нового действия из существующего, то цель ответа существующего действия будет перенесена в новое действие. Таким образом, новое действие может вызвать setResult(int), и результат будет отправлен обратно в цель ответа исходного действия.

Таким образом, А должен собрать все данные, отправленные обратно в статисты, отправленные с D

10 голосов
/ 04 февраля 2012

Да, отличное форматирование. И вы можете - и, вероятно, должны - определенно позвонить startActivityForResult() с каждого из заданий A, B и C (и не finish() сразу). В B и C вы можете проверить успешный результат и finish(), передав результат обратно в A.

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if((resultCode == RESULT_OK) && (requestCode == MY_RESULT_CODE)) {
        setResult(RESULT_OK, data);
        finish();
    }
}

Если вы хотите, чтобы B и C исчезали независимо, выполните вместо этого следующее:

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    setResult(resultCode, data);
    finish();
}
0 голосов
/ 26 января 2018

Я знаю, что это действительно старый вопрос, но я хотел бы найти правильное решение, использовать onNewIntent() и рассматривать его как onActivityResult().

В действии D вы бы структурировали свое намерение как

Intent intent = new Intent(yourContext, Activity_A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("someName", data);
startActivity(intent);
finish();

, а затем в Activity_A

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // update your UI
    intent.getSerializableExtra(...
}
0 голосов
/ 04 февраля 2012

Вы можете сделать B и C как диалоги, которые запускаются из A, и только если B и C в порядке, вы запускаете D с startActivityForResult()

...