Hoe gebruik je Intent.FLAG_ACTIVITY_CLEAR_TOP om de activiteitenstapel te wissen?

Ik heb verschillende berichten gelezen over het gebruik hiervan, maar ik mis iets omdat het niet werkt voor mij. Mijn activiteit A heeft launchmode=”singleTop” in het manifest. Het start activiteit B, met launchmode=”singleInstance”. Activiteit B opent een browser en ontvangt en intentie terug, daarom is het singleInstance. Ik probeer de terugknop te negeren, zodat de gebruiker wordt teruggestuurd naar activiteit A en vervolgens op Terug kan drukken om de activiteit te verlaten, in plaats van weer terug te gaan naar activiteit B.

// activity B
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
 if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR
  && keyCode == KeyEvent.KEYCODE_BACK
  && event.getRepeatCount() == 0) onBackPressed();
 return super.onKeyDown(keyCode, event);
}
@Override
public void onBackPressed() {
 startActivity(new Intent(this, UI.class)
 .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK));
 return;
}

Na terugkomst uit de browser is de stapel…
A,B,Browser,B

Ik verwacht dat deze code de stapel verandert in…
EEN
… zodat opnieuw indrukken de gebruiker terugbrengt naar het startscherm.

In plaats daarvan lijkt het de stapel te veranderen in…
A,B,Browser,B,A
…alsof die vlaggen er niet zijn.

Ik heb geprobeerd finish() aan te roepen in activiteit B na startActivity, maar de terug-knop brengt me weer terug naar de browser!

Wat mis ik?


Antwoord 1, autoriteit 100%

Ik ben begonnen met Activiteit A->B->C->D.
Wanneer op Activiteit DI op de terug-knop wordt gedrukt, wil je naar Activiteit A. Aangezien A mijn startpunt is en daarom al op de stapel staat, worden alle activiteiten bovenaan A gewist en kun je niet meer terug naar een andere Activiteit van A

Dit werkt echt in mijn code:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        Intent a = new Intent(this,A.class);
        a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(a);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}       

Antwoord 2, autoriteit 65%

@bitestar heeft de juiste oplossing, maar er is nog een stap:

Het was verborgen in de documenten, maar je moet de launchModevan de Activitywijzigen in iets anders dan standard. Anders wordt het vernietigd en opnieuw gemaakt in plaats van naar boven te worden teruggezet.


Antwoord 3, autoriteit 22%

Hiervoor gebruik ik de vlag FLAG_ACTIVITY_CLEAR_TOPvoor het starten van Intent
(zonder FLAG_ACTIVITY_NEW_TASK)

en launchMode = "singleTask"in manifest voor gestarte activiteit.

Het lijkt erop dat het werkt zoals ik het nodig heb – activiteit start niet opnieuw en alle andere activiteiten zijn gesloten.


Antwoord 4, autoriteit 10%

Hoewel deze vraag al voldoende antwoorden heeft, dacht ik dat iemand zou willen weten waarom deze vlag op deze eigenaardige manier werkt. Dit is wat ik vond in Android-documentatie

De huidige instantie van activiteit B in het bovenstaande voorbeeld zal ofwel de nieuwe intentie die u hier begint ontvangen in zijn onNewIntent() methode, of zelf worden voltooid en opnieuw gestart met de nieuwe intentie.

Als het zijn startmodus heeft verklaard als “meervoudig” (de standaard) en je hebt FLAG_ACTIVITY_SINGLE_TOP niet met dezelfde bedoeling ingesteld, dan wordt het voltooid en opnieuw gemaakt; voor alle andere opstartmodi of als FLAG_ACTIVITY_SINGLE_TOP is ingesteld, wordt deze intentie geleverd aan de onNewIntent() van de huidige instantie.

Dus, ofwel

1. Verander de launchModevan Activiteit A naar iets anders dan standaard (bijv. singleTaskof zoiets). Dan zal uw vlag FLAG_ACTIVITY_CLEAR_TOPuw activiteit A niet herstarten.

of,

2. Gebruik Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOPals uw vlag. Dan zal het werken zoals u wenst.


Antwoord 5, autoriteit 9%

Ik gebruik drie vlaggen om het probleem op te lossen:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|
                Intent.FLAG_ACTIVITY_CLEAR_TASK | 
                Intent.FLAG_ACTIVITY_NEW_TASK);

Antwoord 6, autoriteit 4%

Android:noHistory=”true” toevoegen aan manifestbestand .

<manifest >
        <activity
            android:name="UI"
            android:noHistory="true"/>
</manifest>

Antwoord 7, autoriteit 3%

ik belde activity_name.this.finish()na het starten van een nieuwe intentie en het werkte voor mij.

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

Maar het zal niet werken voor mij… Ik stel deze oplossing niet voor om te gebruiken, maar als het instellen van een vlag niet voor u werkt, dan kunt u dit proberen.. Maar toch raad ik u aan het niet te gebruiken

p>


Antwoord 8, autoriteit 2%

Ik weet dat er al een geaccepteerd antwoord is, maar ik zie niet hoe het werkt voor de OP, omdat ik denk dat FLAG_ACTIVITY_CLEAR_TOP in zijn specifieke geval niet zinvol is. Die vlag is alleen relevant voor activiteiten in de dezelfde taak. Op basis van zijn beschrijving heeft elke activiteit zijn eigen taak: A, B en de browser.

Iets dat hem misschien van de wijs brengt, is dat A singleTop is, terwijl het singleTask zou moeten zijn. Als A singleTop is en B start A, dan wordt een nieuwe A gemaakt omdat A niet in de taak van B is. Uit de documentatie voor singleTop:

“Als er al een instantie van de activiteit bestaat bovenaan de huidige taak, stuurt het systeem de intentie naar die instantie…”

Sinds B start A, is de huidige taak de taak van B, die voor een singleInstance is en daarom A niet kan bevatten. Gebruik singleTask om daar het gewenste resultaat te bereiken, want dan zal het systeem de taak met A vinden en die taak naar de voorgrond.

Ten slotte, nadat B A heeft gestart en de gebruiker op A drukt, wil de OP noch B noch de browser zien. Om dit te bereiken is het aanroepen van finish() in B correct; nogmaals, FLAG_ACTIVITY_CLEAR_TOP zal de andere activiteiten in A’s taak niet verwijderen omdat zijn andere activiteiten allemaal in verschillende taken vallen. Het stuk dat hij echter miste, is dat B ook FLAG_ACTIVITY_NO_HISTORY moet gebruiken bij het activeren van de intentie voor de browser. Opmerking:als de browser al actief is voordat de toepassing van de OP is gestart, dan zul je natuurlijk de browser zien wanneer je op terug drukt vanuit A. Dus om dit echt te testen, moet je ervoor zorgen dat je teruggaat uit de browser voordat u de applicatie start.


Antwoord 9

FLAG_ACTIVITY_NEW_TASK is het probleem hier dat een nieuwe taak initieert. Verwijder het gewoon & je bent klaar.

Nou, ik raad je aan om te lezen wat elke vlag doet voordat je ermee gaat werken

Lees dit& Intent-vlaggen hier


Antwoord 10

Aanvankelijk had ik ook problemen om FLAG_ACTIVITY_CLEAR_TOP aan het werk te krijgen. Uiteindelijk kreeg ik het werkend door de waarde ervan (0x04000000) te gebruiken. Het lijkt er dus op dat er een probleem is met Eclipse/compiler. Maar helaas wordt de overlevende activiteit opnieuw opgestart, wat niet is wat ik wil. Het lijkt er dus op dat er geen gemakkelijke oplossing is.

Other episodes