Как вернуть результат через несколько действий

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

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

Требования:

Activity B а также C:

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

Вопрос:

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

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

4 ответа

Решение

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

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

С тех пор: API Уровень 1

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

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

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

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

Я знаю, что это действительно старый вопрос, но я хотел бы найти правильное решение, используйте 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(...
}

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

Другие вопросы по тегам