Ho due attività con "menu di navigazione" che contiene elementi per l'avvio di Attività1 e Attività2. Ad esempio, iniziamo Activity2 da Activity1 e quindi vogliamo Activity1 aperto toccando "menu di navigazione", ma quando lo facciamo otteniamo una nuova istanza di Activity1 invece di aprire l'istanza di Estesistente. Come posso aprire l'istanza di Activity1 se già esiste e creare una nuova istanza se no?Come aprire un'attività già aperta invece di crearne una nuova?
risposta
Aggiungere FLAG_ACTIVITY_REORDER_TO_FRONT
al tuo Intent
utilizzato con startActivity()
.
Impostare il flag dell'attività su singleTask
e ignorare lo onNewIntent(Intent intent)
per catturare il nuovo intent.
aggiungere android:launchMode="singleTop"
alla tua attività nel Manifest.xml
<activity android:name=".myActivity" android:label="@string/app_name"
android:launchMode="singleTop" />
check this conoscere diverse launchModes mente anche questo:
Come mostrato nella tabella sopra riportata, di serie è la modalità di default ed è appropriato per la maggior parte dei tipi di attività. SingleTop è anche un comune e una modalità di avvio utile per molti tipi di attività. Le altre modalità - singleTask e SingleInstance - non sono appropriati per la maggior parte delle applicazioni, dal momento che risultano in un modello di interazione che rischia di essere poco familiare per gli utenti ed è molto diverso dalla maggior parte delle altre applicazioni
La risposta più completa sarebbe quella di utilizzare android:launchMode="singleTask"
ea seconda della vostra funzionalità, ignorare onNewIntent poiché sarà chiamato se esiste già un'istanza del Activity
con il nuovo Intent passati ad esso.
<activity
android:name=".MainActivity"
android:launchMode="singleTask"/>
Perché?
In base alla domanda. Ci sono due attività, Activity1 & Activity2
Apriamo Activity1 e poi da Activity1 apriamo Activity2. Poi, all'interno Activity2:
Come posso aprire un'istanza di Activity1 se già esistente e creare nuova istanza se non?
Come indicato nella AndroidManifestActivity_launchMode per singleTask
Se, quando si avvia l'attività, v'è già un compito esecuzione che inizia con questa attività, allora invece di iniziare una nuova istanza l'attività corrente è presente nell'elenco la parte anteriore. L'istanza esistente riceverà una chiamata a Activity.onNewIntent() con il ...
Inoltre, sotto la classe intento, se leggete la singleTask launchMode
utilizza già Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT
e impostare manualmente l'intenzione di non è normalmente impostata dal codice dell'applicazione.
Come indicato nel FLAG_ACTIVITY_BROUGHT_TO_FRONT
int FLAG_ACTIVITY_BROUGHT_TO_FRONT Questo flag non è normalmente fissato dal codice dell'applicazione, ma impostato per voi dal sistema come descritto nella documentazione launchMode per la modalità singleTask.
Pertanto, utilizzando singleTask launchMode
si garantire che vi sia una sola istanza dell'applicazione e non si deve essere aggiunta la bandiera FLAG_ACTIVITY_BROUGHT_TO_FRONT
ai vostri intenti in ogni attività che richiede il vostro Activity2 come suggerito da CommonsWare.
Ora, se si utilizza android:launchMode="singleTop"
come weakwire suggerito, il link si è fornito chiaramente stati;
"singleTop" ... In altre circostanze, ad esempio, se un'istanza esistente dell'attività "singleTop" si trova nell'attività di destinazione, ma non nella parte superiore della pila o se è in cima di uno stack, ma non nel task di destinazione: una nuova istanza verrà creata e inserita nello stack.
In altre parole, ci ritroveremmo con più istanze di Activity1 in alcuni scenari, che è ciò che non vogliamo.
Come ultima opinione, se sei uno di quelli che amano le risposte di modifica che non contribuiscono alla risposta in sé, vai a rispondere ad alcune domande reali se vuoi davvero aumentare la tua reputazione di Overflow dello stack.
- 1. Come aggiornare una pagina Web già aperta
- 2. GWT pagina aperta in una nuova scheda
- 3. Aprire il collegamento in una nuova finestra o concentrarsi su di esso se già aperto
- 4. Come aprire una nuova scheda in CasperJS
- 5. Come aprire una nuova applet da un'applet
- 6. come aprire .pdf in una nuova scheda
- 7. Come aprire il file PDF in una nuova scheda o finestra invece di scaricarlo (usando asp.net)?
- 8. Come aprire Terminal all'ultima directory aperta?
- 9. Apre automaticamente gli strumenti di sviluppo di Chrome quando viene aperta una nuova scheda/nuova finestra
- 10. Javascript aperta una nuova scheda, e attendere che per chiudere
- 11. Attiva l'estensione di Chrome su una nuova scheda aperta
- 12. controlla se una scheda del browser è già aperta quindi non creo schede aggiuntive
- 13. Aprire la risposta su una nuova finestra
- 14. Aprire una nuova finestra in MVVM
- 15. Come forzare 'cp' per sovrascrivere la directory invece di crearne un'altra interna?
- 16. aprire una nuova finestra e chiamare la funzione javascript
- 17. Aprire una nuova finestra in a4j: commandButton
- 18. Firefox Apre una nuova scheda invece di una finestra pop?
- 19. cetriolo + Capybara test per garantire una nuova finestra viene aperta
- 20. AngularJS: come aprire un file in una nuova scheda?
- 21. Come aprire una nuova finestra in Windows Form in .NET?
- 22. Come aprire una nuova pagina HTML usando jQuery?
- 23. Come aprire una nuova scheda sul pulsante clic in Rails?
- 24. Come aprire una nuova sottofinestra da un'altra sottofinestra in vaadin?
- 25. Come aprire una nuova finestra sul modulo inviare
- 26. Come aprire asp: HyperLink.NavigationUrl in una nuova scheda
- 27. Come posso aprire una nuova finestra usando jQuery?
- 28. Aggiornare una riga se esiste, se non crearne una nuova MySQL
- 29. Come verificare se un'applicazione WPF è già in esecuzione?
- 30. Come si crea Sublime Text 3 per aprire un file in una nuova scheda invece di aprirlo nella scheda corrente?
Grazie! Funziona come volevo)) – TFR
Ma usando questo, non viene chiamato il metodo oncreate()? cosa fare se voglio aggiornare l'attività con nuovi dati passati ad esso? Onresume() è lì, ma c'è un altro modo per fare lo stesso? –
@ JD.com: In entrambi i casi è necessario chiamare 'onCreate()' o 'onNewIntent()'. – CommonsWare