Wyczyść cały stos historii i rozpocznij nową aktywność na Androidzie

Czy możliwe jest rozpoczęcie aktywności na stosie, wyczyszczenie całej historii przed nim?

Sytuacja

Mam stos aktywności, który albo idzie A->B->C lub B - > C (Ekran A wybiera token użytkownika, ale wielu użytkowników ma tylko jeden token).

W screenie C użytkownik Może wykonać akcję, która spowoduje, że screen B będzie nieprawidłowy, więc aplikacja chce przenieść je na screen A, niezależnie od tego, czy jest już w stosie. Ekran A powinien być jedyny przedmiot na stosie w mojej aplikacji.

Uwagi

Jest wiele innych podobnych pytań, ale nie znalazłem niczego, co odpowiadałoby dokładnie na to pytanie. Próbowałem wywołać getParent().finish() - to zawsze powoduje wyjątek wskaźnika null. FLAG_ACTIVITY_CLEAR_TOP działa tylko wtedy, gdy aktywność jest już na stosie.

Author: Marian Paździoch, 2010-08-13

10 answers

Na poziomie API 11 Dodano nową flagę intencji tylko w tym celu: Intent.FLAG_ACTIVITY_CLEAR_TASK

Dla wyjaśnienia, użyj tego:

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

Niestety dla API lvl "DontHackAndroidLikeThis" jest rzeczywiście czystym hackerem. Nie powinieneś tego robić. :)

Edit: Zgodnie z komentarzem @ Bena Pearsona, dla API IntentCompat do tego samego. Można użyj znacznika IntentCompat.FLAG_ACTIVITY_CLEAR_TASK, aby wyczyścić zadanie. Możesz więc również obsługiwać pre API level 11.

 553
Author: Akos Cz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:46

Przypadek 1: tylko dwie czynności A i B:

Tutaj przepływ aktywności jest A - > B .Po kliknięciu backbutton z B musimy zamknąć aplikację następnie podczas uruchamiania aktywności B z a wystarczy wywołanie finish () uniemożliwi to Androidowi zapisanie aktywności A w Backstack.eg dla działania A jest Lodowanie / ekran powitalny aplikacji.

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

Przypadek 2: więcej niż dwie czynności:

Jeśli występuje przepływ jak A->B->C->D - > B i po kliknięciu przycisku Wstecz w ćwiczeniu B podczas pochodzące z działalności D.In powinniśmy użyć tej walizki.

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

Tutaj działanie B zostanie uruchomione z backstacka, a nie nowej instancji z powodu intencji.FLAG_ACTIVITY_CLEAR_TOP i Intent.FLAG_ACTIVITY_NEW_TASK czyści stos i czyni go najwyższym one.So po naciśnięciu przycisku back cała aplikacja zostanie zakończona.

 41
Author: monish george,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-03 12:45:55

Z nowszą wersją Androida > = API 16finishAffinity()

Podejście jest odpowiednie dla > = API 16.

Intent mIntent = new Intent(mContext,MainActivity.class);
finishAffinity();
startActivity(mIntent);
  • Its jest taki sam jak rozpoczęcie nowej aktywności i wyczyść cały stos.
  • lub Restart do MainActivity / FirstActivity.
 27
Author: karan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-14 07:19:11

Nad tym też spędziłem kilka godzin ... i zgadzam się, że FLAG_ACTIVITY_CLEAR_TOP brzmi tak, jak chcesz: Wyczyść cały stos, z wyjątkiem uruchamianej aktywności, więc przycisk Wstecz wychodzi z aplikacji. Jednak, jak wspomniał Mike Repass, FLAG_ACTIVITY_CLEAR_TOP działa tylko wtedy, gdy aktywność, którą uruchamiasz, jest już w stosie; gdy aktywności nie ma, flaga nic nie robi.

Co robić? Umieść działanie uruchamiane w stosie z FLAG_ACTIVITY_NEW_TASK, co sprawia, że ta aktywność jest początkiem nowego zadania na stosie historii. Następnie Dodaj znacznik FLAG_ACTIVITY_CLEAR_TOP.

Teraz, gdy FLAG_ACTIVITY_CLEAR_TOP znajdzie nową aktywność w stosie, będzie ona tam i zostanie wyciągnięta, zanim Wszystko inne zostanie wyczyszczone.

Oto moja funkcja wylogowania; parametr widoku jest przyciskiem, do którego funkcja jest dołączona.

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();
}
 19
Author: user2895402,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-18 15:29:06

Nie powinieneś zmieniać stosu. Przycisk Powrót Androida powinien działać jak w przeglądarce internetowej.

Mogę wymyślić, jak to zrobić, ale to niezły hack.

  • Wykonaj swoje działania singleTask dodając je do AndroidManifest Przykład:

    <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"/>
    
  • Extend Application, który będzie trzymał logikę, gdzie iść.

Przykład:

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);
  }
}

Od A do B:

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

Od B do C:

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

W C:

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

I uchwyt z tyłu przycisk do pop() ze stosu.

Po raz kolejny nie powinieneś tego robić:)

 12
Author: Macarse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-27 15:28:49

Natychmiast po rozpoczęciu nowej aktywności, używając startActivity, upewnij się, że wywołujesz finish(), aby bieżąca aktywność nie była ustawiona za nową.

 10
Author: Keith Maurino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-04 16:44:45

Spróbuj tego:

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();
 4
Author: Mohammad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-13 04:48:52
Intent i = new Intent(MainPoliticalLogin.this, MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
 1
Author: Neeraj Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-04 09:27:31

I found too simple hack just do this add new element in AndroidManifest as: -

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

android:noHistory usunie niepożądaną aktywność ze stosu.

 0
Author: Tauseef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-19 08:43:59

Czasami emulator Androida może nie podłączyć narzędzia eclipse DDMS i poprosić o ręczne uruchomienie adb. W takim przypadku można uruchomić lub zatrzymać adb za pomocą wiersza polecenia.

 -1
Author: RajeshkumarG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-06 09:08:54