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.
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.
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.
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.
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();
}
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 doAndroidManifest
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ć:)
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ą.
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();
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);
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.
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.
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