SetResult не работает, когда активность завершена clearTop
Обзор задачи : ActivityA начинает ActivityB с startActivityForResult
. ActivityB устанавливает свой результат с помощью setResult
, а затем запускает ActivityC с помощью startActivity
. ActivityC затем запускает singleTop
ActivityA с установленным флагом CLEAR_TOP
. Я ожидаю, что это завершит ActivityB и вызовет метод ActivityA onActivityResult
. К сожалению, этот метод не вызывается при перезапуске ActivityA.
ActivityA Code : я запустил activity (ActivityB) с startActivityForResult()
следующим кодом от ActivityA:
....
final Intent intent = new Intent(this, ActivityB.class);
startActivityForResult(intent, 0);
....
Следующий код в ActivityA ожидает результата:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == ACTIVITY_RESULT){
doSomethingSpecial();
}
}
ActivityB Code : у меня есть диалоговое окно подтверждения. Когда пользователь нажимает "Да" , он устанавливает результат этого действия, который
private void showConfirmationDialog(String message, final String username) {
AlertDialog.Builder alert = new AlertDialog.Builder(this)
.setMessage(message)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent intent = new Intent(this, ActivityC.class);
setResult(ActivityA.ACTIVITY_RESULT);
startActivity(intent);
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
alert.show();
}
ActivityC Code : когда готово, при нажатии кнопки в ActivityC вызывается следующий код:
private void startActivityA(){
Intent intent = new Intent(this, ActivityA.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
Я ожидаю, что функция doSomethingSpecial()
в ActivityA будет вызвана, но это не так происходящий.
НБ: в качестве отступления, если ActivityB код заменен, и вместо того, чтобы начать ActivityC из диалогового окна, отделка() называется, т. е. ActivityC никогда не открывался и B-это просто закрытые, то doSomethingSpecial()
это действительно называется. Поэтому эта проблема, по-видимому, проистекает из некоторого непонимания функциональности заднего стека и ясного верха.
Любая помощь была бы признательна за то, почему это не ведет себя так, как хотелось бы! Я придумал целый ряд хаки вокруг этого, но мне больше всего интересно, почему это происходит, чтобы улучшить мое понимание стека активности.
1 ответ:
Я думаю, что с точки зрения пользователя будет очень странно, что вы "начинаете" предыдущее действие (а) с более позднего действия (С), вместо того, чтобы просто "вернуться" к нему.
Я считаю, что вы должны начать C от B с
startActivityWithResult()
. Затем, когда действие C будет выполнено, вызовитеfinish()
. В BonActivityResult()
вызовитеsetResult()
, а затемfinish()
.