Tasks e stack posteriore

Un'attività è una raccolta di attività con cui gli utenti interagiscono quando tentano di eseguire eseguire un'azione nell'app. Queste attività sono organizzate in una pila chiamata back stack nell'ordine in cui viene aperta ogni attività.

Ad esempio, un'app email potrebbe avere un'attività per mostrare l'elenco dei nuovi messaggi. Quando l'utente seleziona una si apre una nuova attività per visualizzare il messaggio. Questa nuova attività è stata aggiunta al back stack. Quindi, quando l'utente tocca o fa un gesto Indietro, la nuova attività termina il video e viene saltato fuori dalla pila.

Ciclo di vita di un'attività e del relativo back stack

La schermata Home del dispositivo è il punto di partenza per la maggior parte delle attività. Quando un utente tocca l'icona di un'app o di una scorciatoia in Avvio applicazioni o nella schermata Home, l'attività dell'app va in primo piano. Se non esiste alcuna attività per l'app, viene viene creata una nuova attività e viene attività per quell'app si apre come attività principale nello stack.

Quando l'attività corrente ne inizia un'altra, la nuova attività viene spostata in alto. della pila e concentrarsi. L'attività precedente rimane nell'elenco, ma viene è stata interrotta. Quando un'attività viene interrotta, il sistema conserva lo stato attuale della sua a riga di comando. Quando l'utente esegue l'azione Indietro, l'attività corrente viene sono saltati fuori dalla parte superiore della pila ed eliminati. La l'attività precedente riprende e lo stato precedente della UI viene ripristinato.

Attività del gli stack non vengono mai riorganizzati, ma solo push-on ed estrarre dalla pila così come sono avviati dall'attività corrente e ignorati dall'utente tramite il pulsante o il gesto Indietro. Pertanto, il back stack opera una struttura dell'oggetto last in, first out. La figura 1 mostra una sequenza temporale con delle attività sottoposte a push e sollevate da uno stack posteriore.

Figura 1. Una rappresentazione di come ogni nuova attività in un aggiunge un elemento al back stack. Quando l'utente tocca o fa gesti Indietro, l'attività corrente viene eliminata e quella precedente riprendi.

Mentre l'utente continua a toccare o eseguire i gesti Indietro, ogni attività nell'elenco filtri viene mostrato in risalto per mostrare quello precedente, finché l'utente non torna alla home page, schermata o a qualsiasi attività in esecuzione all'inizio dell'attività. Quando tutto vengono rimosse dall'elenco di attività, l'attività non esiste più.

Comportamento tocco indietro per attività Avvio app principale

Le attività di Avvio applicazioni principali sono attività che dichiarano un intento filtro con entrambi ACTION_MAIN e CATEGORY_LAUNCHER. Queste attività sono uniche perché fungono da punti di ingresso nella tua app da in Avvio applicazioni e vengono utilizzati per avviare un'attività.

Quando un utente tocca o fa gesti Indietro da un'attività di avvio applicazioni principale, il sistema gestisce l'evento in modo diverso a seconda della versione di Android che mentre il dispositivo è in esecuzione.

Comportamento del sistema su Android 11 e versioni precedenti
Il sistema completa l'attività.
Comportamento del sistema su Android 12 e versioni successive

Il sistema sposta l'attività e la relativa attività in background anziché terminando l'attività. Questo comportamento corrisponde al comportamento predefinito del sistema quando uscire da un'app usando il pulsante Home o il gesto.

Nella maggior parte dei casi, questo comportamento significa che gli utenti possono ripristinare più rapidamente l'app da uno stato caldo, invece di dover riavviare completamente l'app da un .

Se devi fornire una navigazione a ritroso personalizzata, consigliamo di utilizzare le API AndroidX Activity anziché eseguire l'override onBackPressed(). Le API AndroidX Activity rimandano automaticamente un comportamento appropriato del sistema se non ci sono componenti che lo intercettano Tocco indietro.

Tuttavia, se la tua app esegue l'override onBackPressed() per gestire Torna alla navigazione a ritroso e completa l'attività, aggiorna l'implementazione per chiamare fino a super.onBackPressed() anziché alla fine. Chiamata in corso super.onBackPressed() sposta l'attività e la relativa attività in background quando siano appropriati e offrano un'esperienza di navigazione più coerente tra le app.

Attività in background e in primo piano

Figura 2. Due attività: l'attività B riceve l'interazione dell'utente in primo piano, mentre l'attività A è in background, in attesa riprendi.

Un'attività è un'unità coesa che può spostarsi in background quando un utente avvia una nuova attività o passa alla schermata Home. In background, tutte le attività dell'attività vengono arrestate, ma lo stack precedente dell'attività rimane intatto, perde l'attenzione mentre è in corso un'altra attività, come mostrato nella figura 2. R l'attività può tornare in primo piano per consentire agli utenti di riprendere da dove hanno interrotto disattivata.

Considera il seguente flusso di attività per l'attività A corrente ha tre attività nell'elenco, di cui due sotto l'attività corrente:

  1. L'utente utilizza il pulsante Home o il gesto, quindi avvia una nuova app dal in Avvio applicazioni.

    Quando viene visualizzata la schermata Home, l'attività A passa in background. Quando il nuovo l'app si avvia, il sistema avvia un'attività per quell'app (attività B) con il proprio di attività.

  2. Dopo aver interagito con l'app, l'utente torna di nuovo alla schermata Home e seleziona la che ha avviato inizialmente l'Attività A.

    Ora l'attività A viene in primo piano: tutte e tre le attività nello stack vengono intatto e l'attività in cima allo stack riprende. A questo punto, l'utente può anche tornare all'Attività B andando alla schermata Home e selezionando l'icona dell'app che hanno avviato quell'attività o selezionando l'attività dell'app dalla sezione Recenti schermo.

di Gemini Advanced.

Più istanze di attività

Figura 3. Per una singola attività è possibile creare un'istanza volte.

Poiché le attività nello stack posteriore non vengono mai riorganizzate, se la tua app consente agli utenti di iniziare una particolare attività da più attività, una nuova dell'attività viene creata e inviata allo stack, invece che portando in alto qualsiasi istanza precedente dell'attività. Di conseguenza, dell'attività nella tua app potrebbe essere creata più volte, anche da diverse attività, come mostrato nella figura 3.

Se l'utente va a ritroso utilizzando il pulsante Indietro le istanze dell'attività vengono mostrate nell'ordine in cui appaiono aperto, ciascuno con il proprio stato dell'interfaccia utente. Tuttavia, puoi modificare questo se non vuoi che un'attività venga creata più di una volta. Impara nella sezione dedicata alla gestione per le attività di machine learning.

Ambienti multi-finestra

Quando le app vengono eseguite contemporaneamente in un ambiente multi-finestra , supportato su Android 7.0 (API livello 24) e superiore, il sistema gestisce le attività separatamente per ogni finestra. Ciascuna può avere più attività. Lo stesso vale per le app Android eseguite su Chromebook: il sistema gestisce attività, o gruppi di attività, su un per finestra.

Riepilogo del ciclo di vita

Per riepilogare il comportamento predefinito per attività e attività:

  • Quando l'attività A inizia l'attività B, l'attività A viene interrotta, ma il sistema conserva lo stato, ad esempio la posizione di scorrimento e qualsiasi testo inserito nei moduli. Se l'utente tocca o utilizza il gesto Indietro nell'attività B, nell'attività A riprende con lo stato ripristinato.

  • Quando l'utente abbandona un'attività utilizzando il pulsante Home o il gesto, lo stato l'attività viene interrotta e la sua attività passa in background. Il sistema conserva lo stato di ogni attività nell'attività. Se l'utente riprende in seguito l'attività entro il giorno selezionando l'icona in Avvio applicazioni che ha avviato l'attività, l'attività viene in primo piano e riprende l'attività in cima all'elenco.

  • Se l'utente tocca o fa un gesto Indietro, l'attività corrente viene acquisita tramite scoppio. automaticamente lo stack. L'attività precedente nello stack riprende. Quando un'attività viene eliminata, il sistema non conserva lo stato dell'attività.

    Questo comportamento è diverso per le attività di avvio principale. se la tua app è eseguita su un dispositivo con Android 12 o versioni successive.

  • È possibile creare un'istanza delle attività più volte, anche da altre attività.

di Gemini Advanced.

Gestisci le attività

Android gestisce le attività e l'archivio posizionando tutte le attività sono iniziate in successione nella stessa attività, nell'ultima tra, prima uno stack. Questo approccio funziona benissimo per la maggior parte delle app e in genere non devi preoccuparti il modo in cui le tue attività sono associate alle attività o come si trovano sul retro stack.

Tuttavia, potresti decidere di interrompere il normale comportamento. Ad esempio, se vuoi che un'attività nella tua app inizi una nuova attività quando avviato, anziché essere posizionati all'interno dell'attività corrente. Oppure, quando avvii attività, potresti voler anticipare un'istanza esistente, invece di creando una nuova istanza in cima allo stack precedente. Oppure potresti vuoi che lo stack precedente venga cancellato da tutte le attività tranne l'attività principale quando l'utente abbandona l'attività.

Puoi eseguire queste e altre operazioni utilizzando gli attributi nella Elemento manifest <activity> e le segnalazioni nell'intent che passi startActivity().

Questi sono gli attributi <activity> principali che puoi utilizzare per gestire le attività:

Questi sono i flag di intent principali che puoi usare:

Le sezioni seguenti illustrano come utilizzare questi attributi del file manifest e indicatori di intent per definire in che modo le attività sono associate alle attività e si comportano nello stack precedente.

Sono discusse anche le considerazioni su come attività e attività sono rappresentate e gestite nella schermata Recenti. Normalmente, lasci che definiscono il modo in cui attività e attività sono rappresentate nel Recenti e non è necessario modificare questo comportamento. Per ulteriori informazioni informazioni, consulta la sezione Schermata Recenti.

Definisci le modalità di avvio

Le modalità di lancio ti consentono di definire in che modo viene associata una nuova istanza di un'attività con l'attività corrente. Puoi definire le modalità di lancio in due modi, descritti nelle sezioni seguenti:

Pertanto, se l'attività A avvia l'attività B, l'attività B può definirla nel suo file manifest il modo in cui si associa all'attività corrente, e l'attività A può utilizzare un flag di intent per richiedere in che modo l'attività B può essere associata all'attività corrente.

Se entrambi definiscono il modo in cui l'attività B viene associata a un'attività, poi l'attività A come definito nell'intento, vengono rispettate rispetto alla richiesta dell'Attività B, come definita nel file manifest.

Definisci le modalità di lancio utilizzando il file manifest

Quando dichiari un'attività nel file manifest, puoi specificare il modo in cui associate a un'attività utilizzando Elemento <activity> launchMode.

Esistono cinque modalità di lancio che puoi assegnare all'attributo launchMode:

  1. "standard"
    La modalità predefinita. Il sistema crea una nuova istanza dell'attività nell'attività da cui è stato avviato e instrada l'intent a quest'ultimo. L'attività può essere creata più volte, ogni istanza può appartenere ad attività diverse un'attività può avere più istanze.
    .
  2. "singleTop"
    Se nella parte superiore dell'attività corrente esiste già un'istanza dell'attività, il sistema instrada l'intent a quell'istanza tramite una chiamata alla sua onNewIntent() anziché creare una nuova istanza dell'attività. L'attività è creata più volte, ogni istanza può appartenere ad attività diverse e un'attività può avere più istanze (ma solo se l'attività in alto dello stack posteriore non è un'istanza esistente dell'attività).

    Ad esempio, supponiamo che lo stack posteriore di un'attività sia costituito dall'attività principale A con le attività B, C e D in alto (quindi la pila è A-B-C-D, con D in alto). Un'intenzione arriva per un'attività di tipo D. Se per D è impostato l'avvio predefinito di "standard" , viene avviata una nuova istanza della classe e lo stack diventa A-B-C-D-D. Tuttavia, se la modalità di avvio di D è "singleTop", l'istanza esistente di D riceve l'intent tramite onNewIntent(), perché si trova in cima alla pila, e quest'ultima rimane A-B-C-D. Se dall'altro, per un'attività di tipo B, viene aggiunta una nuova istanza di B anche se la modalità di avvio è "singleTop".

  3. "singleTask"
    Il sistema crea l'attività alla base di una nuova attività o individua la su un'attività esistente con la stessa affinità. Se un'istanza del componente esiste già un'attività, il sistema instrada all'istanza esistente tramite una chiamata alla sua onNewIntent() anziché creare una nuova istanza. Nel frattempo, tutti gli altri vengono distrutte.
    di Gemini Advanced.
    .
  4. "singleInstance".
    Il comportamento è lo stesso di "singleTask", ad eccezione del fatto che il sistema non avvia nessun altro delle attività nell'attività che contiene l'istanza. L'attività è sempre l'unico e unico membro della sua attività. Tutte le attività iniziate da questa si aprono tra per un'attività a parte.
    .
  5. "singleInstancePerTask".
    L'attività può essere eseguita solo come attività principale dell'attività, la prima all'attività che ha creato l'attività, perciò può esserci una sola istanza di questa attività in un'attività. A differenza della modalità di avvio di singleTask, questa l'attività può essere avviata in più istanze in diverse attività se FLAG_ACTIVITY_MULTIPLE_TASK o FLAG_ACTIVITY_NEW_DOCUMENT è stato impostato.
di Gemini Advanced.

Per fare un altro esempio, l'app Browser Android dichiara che il browser web l'attività si apre sempre nella propria attività specificando singleTask modalità di avvio in <activity> . Ciò significa che se la tua app emette l'intenzione di aprire l'app del browser, la sua attività non viene collocata nella stessa attività della tua app. Invece, viene avviata una nuova attività per il browser o, se il browser ne ha già una in esecuzione in background, l'attività viene spostata in avanti per gestire l'intento.

A prescindere dal fatto che un'attività inizi in una nuova attività o nella stessa attività l'attività che l'ha avviata, il pulsante Indietro e il gesto eseguono sempre all'attività precedente. Tuttavia, se inizi un'attività che specifica la modalità di avvio singleTask e un'istanza di questa attività esiste in l'attività in background, l'intera attività viene portata in primo piano. A questo punto, lo stack posteriore include tutte le attività dell'attività in cima alla pila. La figura 4 mostra questo tipo di scenario.

Figura 4. Una rappresentazione di come un'attività con il lancio la modalità "singleTask" viene aggiunta allo stack posteriore. Se l'attività fa già parte di un'attività in background con il proprio back stack, allora l'intero back stack arriva in avanti, in cima allo stack attività.

Per ulteriori informazioni sull'utilizzo delle modalità di avvio nel file manifest, consulta <activity>.

Definizione delle modalità di avvio mediante flag di intent

Quando avvii un'attività, puoi modificare la sua associazione predefinita all'attività includendo flag nell'intent che invii startActivity() I flag che puoi utilizzare per modificare il comportamento predefinito sono i seguenti:

FLAG_ACTIVITY_NEW_TASK

Il sistema avvia l'attività in una nuova attività. Se un'attività è già in esecuzione per viene messa in primo piano con il suo ripristinato l'ultimo stato e l'attività riceve il nuovo intent onNewIntent()

Questo produce lo stesso comportamento di "singleTask" Valore di launchMode discusso nella sezione precedente.

FLAG_ACTIVITY_SINGLE_TOP

Se l'attività che stai iniziando è l'attività corrente, nella parte superiore della parte posteriore stack, l'istanza esistente riceve una chiamata onNewIntent() anziché creare una nuova istanza dell'attività.

Questo produce lo stesso comportamento di "singleTop" launchMode valore discusso nella sezione precedente.

FLAG_ACTIVITY_CLEAR_TOP

Se l'attività avviata è già in esecuzione nell'attività corrente, invece di avviare una nuova istanza di quell'attività, distrugge tutte le altre attività associate. L'intento è inviati all'istanza ripresa dell'attività, ora in alto, onNewIntent().

Non è presente alcun valore per l'attributo launchMode che produce questo comportamento.

FLAG_ACTIVITY_CLEAR_TOP viene utilizzato più spesso in combinazione con FLAG_ACTIVITY_NEW_TASK. Se utilizzati insieme, questi flag individuare un'attività esistente in un'altra attività e posizionarla in cui può rispondere all'intento.

Gestire le affinità

Un'affinità indica quale attività "preferisce" un'attività a cui appartengono. Di per impostazione predefinita, tutte le attività della stessa app hanno un'affinità tra loro: che "preferiscono" svolgere la stessa attività.

Tuttavia, puoi modificare l'affinità predefinita per un'attività. Attività definite in app diverse possono condividere un'affinità e attività definite nella stessa app possono essere assegnate diverse affinità delle attività.

Puoi modificare l'affinità di un'attività utilizzando il taskAffinity attributo di <activity> .

L'attributo taskAffinity accetta un valore di stringa che deve essere diverso da il nome del pacchetto predefinito dichiarato in <manifest> perché il sistema lo utilizza per identificare l'attività predefinita affinità per l'app.

L'affinità entra in gioco in due circostanze:

  1. Quando l'intent che avvia un'attività contiene FLAG_ACTIVITY_NEW_TASK flag.

    Per impostazione predefinita, viene avviata una nuova attività nell'attività dell'attività che chiamata startActivity() Viene eseguito il push sullo stesso stack posteriore del chiamante.

    Tuttavia, se l'intent passato a startActivity() contiene il parametro FLAG_ACTIVITY_NEW_TASK , il sistema cerca un'attività diversa per ospitare la nuova attività. Spesso, questa è una nuova attività. Tuttavia, non deve essere necessariamente così. Se c'è attività esistente con la stessa affinità della nuova attività, l'attività viene avviato in quell'attività. In caso contrario, avvia una nuova attività.

    Se questo flag fa sì che un'attività inizi una nuova attività e l'utente utilizza il parametro Pulsante Home o gesto per abbandonare la schermata, l'utente deve avere un modo per torna all'attività. Alcune entità, come la gestione notifiche, iniziano sempre attività in un'attività esterna, mai come parte della propria, quindi inserisce sempre FLAG_ACTIVITY_NEW_TASK negli intent a cui trasmette startActivity().

    Se un'entità esterna "utilizza questo flag" può richiamare la tua attività, assicurati che l'utente abbia in modo indipendente per l'attività avviata, ad esempio con un'icona in Avvio applicazioni, in cui l'attività principale l'attività ha CATEGORY_LAUNCHER filtro per intent. Per ulteriori informazioni, consulta la sezione sull'avvio delle attività.

  2. Quando un'attività ha il suo allowTaskReparenting impostato su "true".

    In questo caso, l'attività può passare dall'attività avviata all'attività che ha un'affinità per quando l'attività diventa in primo piano.

    Ad esempio, supponiamo che un'attività che indichi le condizioni meteo a città selezionate fa parte di un'app di viaggi. Ha la stessa affinità ad altre attività nella stessa app, l'affinità app predefinita e può essere assegnato nuovamente con questo attributo.

    Quando inizia una delle tue attività, da autore di previsioni meteo, inizialmente appartiene alla stessa attività della tua attività. Tuttavia, quando l'attività dell'app di viaggi viene in primo piano, la L'attività del reporter meteo viene riassegnata all'attività e visualizzata al suo interno.

di Gemini Advanced.

Cancella lo stack posteriore

Se l'utente abbandona un'attività per un lungo periodo di tempo, il sistema annulla l'attività tranne l'attività principale. Quando l'utente torna all'attività, viene ripristinata solo l'attività principale. Il sistema si comporta in questo modo in base presupposto che, dopo per un periodo prolungato di tempo gli utenti hanno abbandonato ciò che stavano facendo prima e tornano all'attività per iniziare qualcosa di nuovo.

Esistono alcuni attributi delle attività che puoi utilizzare per modificare questo comportamento:

alwaysRetainTaskState
Se questo attributo è impostato su "true" nell'attività principale di un'attività, il valore il comportamento predefinito appena descritto non si verifica. L'attività conserva tutte le di attività nella sua pila anche dopo un lungo periodo di tempo.
clearTaskOnLaunch

Se questo attributo è impostato su "true" nell'attività principale di un'attività, l'attività viene trasferito all'attività principale ogni volta che l'utente abbandona l'attività i dati. In altre parole, è l'opposto di alwaysRetainTaskState. La l'utente torna sempre all'attività nello stato iniziale, anche dopo aver lasciato per un attimo.

finishOnTaskLaunch

Questo attributo è simile a clearTaskOnLaunch, ma opera su una singola attività, non su un'intera attività. Può anche causare qualsiasi attività da completare tranne l'attività principale. Se impostato su "true", l'attività rimane parte dell'attività solo per la sessione corrente. Se l'utente abbandona e poi torna all'attività, questa non è più presente.

Avvia un'attività

Puoi configurare un'attività come punto di ingresso di un'attività assegnandole un intent filtra con "android.intent.action.MAIN" come azione specificata e "android.intent.category.LAUNCHER" come categoria specificata:

<activity ... >
    <intent-filter ... >
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    ...
</activity>

Un filtro per intent di questo tipo attiva un'icona e un'etichetta per l'attività viene visualizzata in Avvio applicazioni, offrendo agli utenti un modo per avviare l'attività e all'attività creata in qualsiasi momento dopo l'avvio.

Questa seconda funzionalità è importante. Gli utenti devono poter uscire da un'attività e poi torna indietro in un secondo momento usando questo attivatore di attività. Per questo motivo, utilizza solo i due modalità di avvio che contrassegnano le attività come sempre all'inizio di un'attività, "singleTask" e "singleInstance", quando l'attività ha uno ACTION_MAIN e un CATEGORY_LAUNCHER filtro.

Immagina, ad esempio, cosa potrebbe succedere se manca il filtro: intent avvia un'attività "singleTask", avvia una nuova attività e l'utente dedica del tempo a questa attività. L'utente utilizza quindi il pulsante Home o gesto. L'attività viene ora inviata in background e non è visibile. Ora l'utente non ha modo di tornare all'attività perché non è rappresentata nell'app Avvio app.

Nei casi in cui non vuoi che l'utente ritorni a un dell'attività, imposta la <activity> finishOnTaskLaunch dell'elemento a "true". Per ulteriori informazioni, consulta la sezione relativa allo svuotamento dello stack posteriore.

Ulteriori informazioni su come le attività e le attività sono rappresentate e gestite nella schermata Recenti è disponibile in Recenti schermo.

Altre risorse