Modalità di avvio singleTask o singleInstance di Android? [chiuso]


84

Ho un'app che ha un elenco come attività principale e quindi puoi fare clic sugli elementi che apre una visualizzazione dettagliata di quell'elemento. Ho anche un'attività di ricerca simile all'attività principale e funziona come previsto.

Tuttavia, desidero che questa attività di ricerca abbia una sola istanza nello stack in modo che gli utenti possano cercare più volte e facendo clic su Indietro li riporterebbe alla visualizzazione precedente in cui si trovavano prima di iniziare la ricerca (piuttosto che tornare ai risultati della ricerca precedente)

sia la modalità di lancio singleTask che quella singelInstance sembrano fare quello che voglio quindi non sono sicuro di quale dovrei usare per questo scopo e perché?

Risposte:


141

Dalla pagina App Fundamentals della guida per sviluppatori Android:

Per impostazione predefinita, tutte le attività in un'applicazione hanno un'affinità l'una con l'altra, ovvero è preferibile che appartengano tutte alla stessa attività.

Un'attività "singleInstance" è l'unica attività nel suo compito. Se avvia un'altra attività, tale attività verrà avviata in un'attività diversa indipendentemente dalla modalità di avvio, come se FLAG_ACTIVITY_NEW_TASK fosse nell'intento. In tutti gli altri aspetti, la modalità "singleInstance" è identica a "singleTask".

Come notato sopra, non c'è mai più di un'istanza di un'attività "singleTask" o "singleInstance", quindi ci si aspetta che quell'istanza gestisca tutti i nuovi intenti. Un'attività "singleInstance" è sempre in cima alla pila (poiché è l'unica attività nell'attività), quindi è sempre in grado di gestire l'intento. Tuttavia, un'attività "singleTask" può o non può avere altre attività sopra di essa nello stack. Se lo fa, non è in grado di gestire l'intento e l'intento viene abbandonato. (Anche se l'intento è stato abbandonato, il suo arrivo avrebbe fatto sì che l'attività venisse in primo piano, dove sarebbe rimasta.)

4 Attività in un'attività

Poiché non c'è mai più di un'istanza dell'attività con nessuna delle due modalità di avvio, il pulsante Indietro ti porterà sempre all'istanza esistente dell'attività nel tuo caso.

Una differenza importante è che "singleTask" non richiede la creazione di una nuova attività per le nuove attività che vengono avviate quando viene selezionato qualcosa. Né dovrà rimuovere ogni volta quella nuova attività sul pulsante Indietro.

Dal momento che il tuo stack di attività riguarda tutte le "attività" di un utente, e non sembra che tu abbia una struttura complessa di Intent in cui singleInstance può essere utile per gestirle sempre, suggerirei di utilizzare la modalità di lancio singleTask.

Ecco un buon post sul blog per maggiori informazioni, oltre a essere accreditato per l'immagine: Serie di attività e attività Android : un'introduzione al modello di componenti dell'interfaccia utente di Android


4
Grazie! sembra una buona lettura ... il fatto è che ho capito che in realtà VOGLIO più istanze di un'attività e solo quando l'attività in primo piano è un'attività di ricerca e viene eseguita un'altra ricerca dovrebbe utilizzare quell'attività esistente (come il modo in cui funziona il mercato) E per questo il singeTop è esattamente quello che sto cercando, ma grazie per l'aiuto comunque =) grazie
Kman

1
Ehi, grazie. Questo post ben scritto mi ha aiutato in un pizzico.
icecreamman

Grazie per i dettagli, soprattutto questo (anche se l'intento è stato abbandonato, il suo arrivo avrebbe fatto sì che il compito venisse in primo piano, dove sarebbe rimasto.) , Che cancella immediatamente la mia confusione. Stavo solo pensando a cosa succederebbe se un'attività singleTask non fosse in cima allo stack mentre volevo ancora raggiungerla senza specificare FLAG_ACTIVITY_CLEAR_TOP .
neevek


30

In un modo semplice-

singleTask:

Il sistema crea una nuova attività e istanzia l'attività alla radice della nuova attività. Tuttavia, se un'istanza dell'attività esiste già in un'attività separata, il sistema instrada l'intento all'istanza esistente tramite una chiamata al suo onNewIntent()metodo, anziché creare una nuova istanza. one instancePuò esistere solo un'attività alla volta.

Nota: sebbene l'attività inizi in una nuova attività, il pulsante Indietro riporta l'utente all'attività precedente.

singola istanza-

Uguale a "singleTask", tranne per il fatto che il sistema non avvia altre attività nell'attività che contiene l'istanza . L'attività è sempre l'unico e unico componente del suo compito; qualsiasi attività iniziata da questa viene aperta in un'attività separata .


4

singleTaske le singleInstanceattività possono solo iniziare un'attività. Sono sempre alla radice dello stack di attività. Inoltre, il dispositivo può contenere solo un'istanza dell'attività alla volta, solo una di queste attività.
per più Android: launchMode .


1
l'ultima frase è vera per singleInstance, non singleTask
Serdar Samancıoğlu

@SerdarS. apprezzo il tuo commento. Aggiunta di ulteriori informazioni su singleTask: il sistema crea una nuova attività e istanzia l'attività alla radice della nuova attività. Tuttavia, se un'istanza dell'attività esiste già in un'attività separata, il sistema instrada l'intento all'istanza esistente tramite una chiamata al suo onNewIntent()metodo, anziché creare una nuova istanza. Può esistere solo un'istanza dell'attività alla volta. per più developer.android.com
Rupesh Yadav

Capito, allora mi sbagliavo. Dispiace disturbarla.
Serdar Samancıoğlu
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.