startActivity без добавления в задний стек - PullRequest
0 голосов
/ 05 февраля 2020

Этот вопрос ранее задавался по-разному, но мне еще предстоит найти решение, которое работает. Я полагаю, что проблема связана с флагами намерений для начала действия, но при добавлении всех возможных решений проблема все еще сохраняется. Изначально no_histroy и clear_top были достаточными, но это больше не работает, а также new_task или clear_task не выполняет / исключает вышеупомянутое.

В существующем производственном приложении пользователь имеет обзор переработчика локальных файлов PDF. Когда они выбирают один из них в обзоре утилит, мы вызываем метод showPdf (), см. Фрагмент. Шаг назад в стеке работает нормально (пока). В том же фрагменте, что и в программе просмотра, пользователь может загрузить дополнительные файлы PDF. Эта кнопка перемещается к другому фрагменту, который является веб-представлением. К WebView присоединен интерфейсный класс JS, который будет обрабатывать действия в WebView, одним из которых является загрузка и отображение файла PDF. Таким образом, пользователь загружает этот PDF и использует тот же метод showPdf (). Пользователь использует кнопку «Назад», которая возвращается в WebView. Пользователь снова нажимает, и это должно вернуться к фрагменту просмотра переработчика, но вместо этого он возвращается к действию, начатому из исходного касания элемента просмотра переработчика. Посмотрите поток в каркасном режиме, следуйте зеленому -> оранжевый -> красный.

public void showPdf(Uri path) {
    AppLog.d(TAG, "-> showPdf()");

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(path, "application/pdf");
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

    if (getContext().getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() > 0) {
        getContext().startActivity(intent);
    } else {
        displayAlert(getResources().getString(R.string.error_no_pdf_viewer_title),
                getResources().getString(R.string.error_no_pdf_viewer_body),
                null,
                null);
    }
}

Каркасный пример. Красный поток НЕ должен происходить, он должен вернуться в MainFragment. enter image description here

1 Ответ

0 голосов
/ 07 февраля 2020

Эти флаги Intent все еще являются допустимыми способами удаления Activity из стека или запуска новой Task и избавления от этой задачи при извлечении стека.

Проблема была связана с MutableLiveData, вызывающим метод showPdf () от основного фрагмента. Наблюдатель увидел обновление, когда фрагмент выскочил и снова запустил showPdf (). Изменение этого значения на SingleLiveEvent решило проблему, и действие больше не находится в стеке.

...