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.
![](https://developer.android.google.cn/static/images/fundamentals/diagram_backstack.png?authuser=0000&hl=it)
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 asuper.onBackPressed()
anziché alla fine. Chiamata in corsosuper.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
![](https://developer.android.google.cn/static/images/fundamentals/diagram_multitasking.png?authuser=0000&hl=it)
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:
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à.
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.
Più istanze di attività
![](https://developer.android.google.cn/static/images/fundamentals/diagram_multiple_instances.png?authuser=0000&hl=it)
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à.
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à:
taskAffinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch
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:
-
Quando dichiari un'attività nel file manifest, puoi specificare il modo in cui l'attività viene associata alle attività all'avvio.
-
Quando chiami
startActivity()
, puoi includere un flagIntent
che dichiara come e se la nuova attività sarà associata all'attività corrente.
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
:
"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.
"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 tramiteonNewIntent()
, 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"
."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.
"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.
"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à seFLAG_ACTIVITY_MULTIPLE_TASK
oFLAG_ACTIVITY_NEW_DOCUMENT
è stato impostato.
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.
![](https://developer.android.google.cn/static/images/fundamentals/diagram_backstack_singletask_multiactivity.png?authuser=0000&hl=it)
"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 dilaunchMode
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 conFLAG_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:
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 parametroFLAG_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 trasmettestartActivity()
.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à.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.
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 dialwaysRetainTaskState
. 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.