Этот вопрос ранее задавался по-разному, но мне еще предстоит найти решение, которое работает. Я полагаю, что проблема связана с флагами намерений для начала действия, но при добавлении всех возможных решений проблема все еще сохраняется. Изначально 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.