Как вернуть результат с помощью нескольких действий

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

enter image description here

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

требования:

Activity B и C:

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

вопрос:

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

Как я могу это осуществить?

4 ответов


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

public static final int FLAG_ACTIVITY_FORWARD_RESULT

Since: API Level 1

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

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


да, отличное форматирование. И вы можете-и, вероятно, должны-определенно позвонить 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();
}

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