2010-07-16 4 views
20

Sono appena stato bruciato da un widget. Ho potuto vedere la causa del problema, ma non sono riuscito a determinare il motivo o la sua soluzione. Il mio widget stava emettendo una ricerca (SearchManager) e l'attività ha lanciato una finestra di ricerca, ma quando ha richiamato il mio widget, ha creato un altro riferimento al widget (cioè, l'ID del thread era lo stesso, ma l'id del widget cambiato da 65 a 0).Quando è necessario utilizzare singleTop launchMode in un widget o un'applicazione Android?

Questo mi ha portato a credere che si stava creando una nuova istanza e ho cercato nella documentazione le impostazioni applicabili al problema. Alla fine, mi sono imbattuto nello android:launchMode="singleTop" e non appena l'ho impostato su AndroidManifest, viola! Il mio widget ha funzionato.

Questo mi ha portato la parte migliore di due giorni per eseguire il debug.

Ci sono altre situazioni o c'è una risposta tecnicamente più corretta al mio problema?

+1

Non penso che il titolo della domanda sia utile per i contenuti. Speravo di vedere una domanda e risposte sui casi d'uso appropriati per singleTop. Questo è un po 'di narrativa di sviluppo e quindi una citazione dalla documentazione. – helloPiers

+1

@ Lotto105 - abbastanza giusto. Vai avanti e aggiungi alcune risposte. È stato un grosso problema che ho riscontrato, così ho fatto "chiedi e rispondi alla tua stessa domanda" come suggerito da SO. Sono certo che il/i contributo/i della tua risposta e altri miglioreranno questa sessione di domande e risposte. Ha avuto oltre 3000 visualizzazioni, quindi c'è chiaramente interesse. Dubito che la mia risposta sia * SOLO * risposta :) E naturalmente, è un riferimento e una citazione dal doc poiché è lì che ho ottenuto la mia risposta. Personalmente, trovo un valore reale in questo stile/risposta in quanto chiarisce DOC. – mobibob

+1

Avrei dovuto essere più chiaro. La domanda corpo e risposta sono utili e interessanti di per sé, assolutamente. – helloPiers

risposta

36

Ho fatto più letture su Android Docs - Potrei passare una vita leggendo i loro documenti e trovare un nuovo sottile dettaglio che mi spezza il cervello :) Questo spiega le mie istanze multiple che non mi aspettavo, tuttavia, ho configurato per si verificano.

Android Doc on Activity definition for AndroidManifest.xml

Le modalità "Standard" e "singleTop" differiscono l'uno dall'altro in un solo rispetto: Ogni volta che c'è di nuovo intento per un'attività "standard", una nuova istanza del classe è stata creata per rispondere a tale intento. Ogni istanza gestisce un singolo intent. Analogamente, una nuova istanza di un'attività "singleTop" può anche essere creata per gestire un nuovo intento . Tuttavia, se l'attività di destinazione ha già un'istanza esistente di l'attività nella parte superiore dello stack, , quell'istanza riceverà il nuovo intento (in una chiamata onNewIntent()); una nuova istanza non creata. In altre circostanze - per esempio, se un un'istanza della "singleTop" attività esistente è nel compito bersaglio, ma non in cima alla pila, o se è alla sommità di una pila, ma non in l'attività di destinazione: una nuova istanza dovrebbe essere creata e inserita nello stack.

+6

"o se si trova nella parte superiore di uno stack, ma non nel task di destinazione, una nuova istanza verrà creata e inserita nello stack." Perché? Qualcuno può spiegare ulteriormente questa sezione citata? – Patrick

+0

@Patrick Credo che questo scenario si verifichi quando utilizzi FLAG_ACTIVITY_NEW_TASK. In questo caso, non ti interessa l'attività esistente e stai creando una nuova attività, quindi la tua attività diventa l'unica nella nuova attività.Correggimi se sbaglio. –