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 2

1 ответ:

Я думаю, что с точки зрения пользователя будет очень странно, что вы "начинаете" предыдущее действие (а) с более позднего действия (С), вместо того, чтобы просто "вернуться" к нему.

Я считаю, что вы должны начать C от B с startActivityWithResult(). Затем, когда действие C будет выполнено, вызовите finish(). В B onActivityResult() вызовите setResult(), а затем finish().