Очистите весь стек истории и запустите новое действие на Android

Можно ли начать работу над стеком, очистив всю историю до этого?

Ситуация

У меня есть стек действий, который либо идет A-> B-> C, либо B-> C (экран A выбирает токен пользователей, но у многих пользователей есть только один токен).

На экране C пользователь может предпринять действие, которое делает экран B недействительным, поэтому приложение хочет взять их на экран A, независимо от того, находится ли он уже в стеке. Экран A должен быть единственным элементом в стеке в моем приложении.

Заметки

Есть много других подобных вопросов, но я не нашел ничего, что отвечает на этот точный вопрос. Я попытался вызвать getParent().finish() – это всегда приводит к исключению нулевого указателя. FLAG_ACTIVITY_CLEAR_TOP работает только в том случае, если активность уже находится в стеке.

В уровне API 11 для этого был добавлен новый флаг Intent: Intent.FLAG_ACTIVITY_CLEAR_TASK

Чтобы уточнить, используйте это:

 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 

К сожалению для API lvl <= 10, я еще не нашел для этого чистого решения. Решение «DontHackAndroidLikeThis» действительно является чистым хакером. Вы не должны этого делать. 🙂

Изменить: согласно комментарию @ Ben Pearson , для API <= 10 теперь можно использовать класс IntentCompat для этого. Для очистки задачи можно использовать флаг IntentCompat.FLAG_ACTIVITY_CLEAR_TASK . Таким образом, вы также можете поддерживать уровень API до уровня 11.

Случай 1: Только два действия A и B:

Здесь поток активности A-> B. При щелчке по кнопке от B нам нужно закрыть приложение, а затем, запустив действие B из A just call finish (), это предотвратит сохранение андроидом активности A в Backstack.eg для активности A Loding / Заставка экрана приложения.

 Intent newIntent = new Intent(A.this, B.class); startActivity(newIntent); finish(); 

Случай 2: более двух видов деятельности:

Если есть поток, подобный A-> B-> C-> D-> B, и нажатие кнопки «Назад» в действии B при поступлении из действия D. В этом случае мы должны использовать.

 Intent newIntent = new Intent(D.this,B.class); newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(newIntent); 

Здесь активность B будет запускаться из backstack, а не из нового экземпляра из-за Intent.FLAG_ACTIVITY_CLEAR_TOP и Intent.FLAG_ACTIVITY_NEW_TASK очищает стек и делает его верхней. Таким образом, когда мы нажимаем кнопку «Назад», вся заявка будет прекращена.

Я потратил несколько часов на это тоже … и согласен с тем, что FLAG_ACTIVITY_CLEAR_TOP звучит так, как вам хотелось бы: очистить весь стек, кроме запуска активности, поэтому кнопка «Назад» выходит из приложения. Однако, как отметил Майк Репасс, FLAG_ACTIVITY_CLEAR_TOP работает только тогда, когда запущенная вами деятельность уже находится в стеке; Когда активности там нет, флаг ничего не делает.

Что делать? Поместите запущенную деятельность в стек с FLAG_ACTIVITY_NEW_TASK, что делает эту деятельность началом новой задачи в стеке истории. Затем добавьте флаг FLAG_ACTIVITY_CLEAR_TOP.

Теперь, когда FLAG_ACTIVITY_CLEAR_TOP отправляется на поиск нового действия в стеке, он будет там и будет остановлен до того, как все остальное будет очищено.

Вот моя функция выхода из системы; Параметр «Вид» – это кнопка, к которой прикреплена функция.

 public void onLogoutClick(final View view) { Intent i = new Intent(this, Splash.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(i); finish(); } 

Вы не должны менять стек. Кнопка Android back должна работать как в веб-браузере.

Я могу придумать, как это сделать, но это довольно взломать.

  • Сделайте свои действия singleTask , добавив его в AndroidManifest Пример:

     <activity android:name=".activities.A" android:label="@string/A_title" android:launchMode="singleTask"/> <activity android:name=".activities.B" android:label="@string/B_title" android:launchMode="singleTask"/> 
  • Расширьте Application которое будет придерживаться логики того, куда идти.

Пример:

 public class DontHackAndroidLikeThis extends Application { private Stack<Activity> classes = new Stack<Activity>(); public Activity getBackActivity() { return classes.pop(); } public void addBackActivity(Activity activity) { classes.push(activity); } } 

От а до б:

 DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication(); app.addBackActivity(A.class); startActivity(this, B.class); 

От B до C:

 DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication(); app.addBackActivity(B.class); startActivity(this, C.class); 

В C:

 If ( shouldNotGoBackToB() ) { DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication(); app.pop(); } 

И отредактируйте обратную кнопку для pop() из стека.

Еще раз, вы не должны этого делать 🙂

С finishAffinity() Android> = API 16 используйте finishAffinity()

Подход подходит для> = API 16.

 Intent mIntent = new Intent(mContext,MainActivity.class); finishAffinity(); startActivity(mIntent); 
  • Это то же самое, что и начать новую активность, и очистить весь стек.
  • ИЛИ Перезапустите MainActivity / FirstActivity.

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

Я нашел слишком простой взлом, просто добавьте новый элемент в AndroidManifest как: –

 <activity android:name=".activityName" android:label="@string/app_name" android:noHistory="true"/> 

android:noHistory очистит вашу нежелательную активность от Stack.

Попробуй это:

 Intent logout_intent = new Intent(DashboardActivity.this, LoginActivity.class); logout_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); logout_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); logout_intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(logout_intent); finish(); 

Иногда ваш эмулятор Android может не подключиться к инструменту DDL eclipse и попросить запустить adb вручную. В этом случае вы можете запустить или остановить adb с помощью командной строки.

Intereting Posts
Как сохранить формат mp4 с использованием камеры по умолчанию с помощью видеомагнитофона Почему я не могу получить значения fromdeclare с типом TypedArray через getStyledAttributes? Ошибка регистрации событий Firebase Analytics Копирование предупреждающего сообщения при наведении на WORD в Android Studio с помощью Mac Как установить вид изображения в диалоговом окне андроида? Перезагрузка страницы веб-браузера android после захвата изображения и загрузка в android 5+ Loop / бесконечный ScrollView React-Native Кордова – Несколько файлов dex определяют (аннотация) Отключение анимации в ViewPager Сделайте кнопку «вверх», как кнопка «назад» на Android Преобразование результатов Sqllite Cursor в мой объект Запуск тестов JUnit в приложении Gradle для Android Android Export отменен, потому что была найдена фатальная ошибка Почему приложение на Android не должно быть написано на C / C ++, потому что вы просто предпочитаете программировать на C / C ++? Как преобразовать R.color в цвет?