Как вернуть результат через несколько действий
В какой-то части моего приложения есть такая структура действий:
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()