2011-09-03 15 views
14

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

25

Aggiungere FLAG_ACTIVITY_REORDER_TO_FRONT al tuo Intent utilizzato con startActivity().

+0

Grazie! Funziona come volevo)) – TFR

+1

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? –

+1

@ JD.com: In entrambi i casi è necessario chiamare 'onCreate()' o 'onNewIntent()'. – CommonsWare

2

Impostare il flag dell'attività su singleTask e ignorare lo onNewIntent(Intent intent) per catturare il nuovo intent.

4

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

0

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.

Problemi correlati