2012-03-07 10 views
40

Consente di provare a spiegare la mia domanda: Ho ricevuto un'applicazione e un servizio. L'applicazione viene avviata con l'attività A. Il servizio invia una trasmissione che vi permetterà di avviare l'applicazione Attività B Ora l'utente avvia l'attività C.Android: come evitare di iniziare un'attività che è già in pila?

Ora il servizio vuole iniziare di nuovo l'attività B. Ma come faccio a fargli sapere che l'attività è ancora in pila, o c'è una bandiera intent per questo?

Come evitare che lancerà l'attività B perché è già nello stack?

+0

Che cosa è esattamente D? È il codice che stai scrivendo? Se è così, la risposta è semplice, ** non ** chiama 'StartActivity (B)'. –

+0

Mi dispiace, ho riscritto la mia domanda :) –

risposta

55

penso che è necessario per rendere la vostra attività di B singleInstance che se è già creare non si vuole creare ancora una volta, che è launch mode of the activity possono essere definiti in palese android:launchMode che definisce come l'attività sarà istanziare.

nel vostro caso d'uso android:launchMode="singleInstance"

+1

Funzionante bene! :) Grazie –

+2

Ma se imposto il launchMode su singleInstance non otterrò correttamente i callback onActivityResult. – DevAndroid

+1

è risolvere il mio problema .. –

21

È possibile utilizzare la bandiera Intent.FLAG_ACTIVITY_NEW_TASK. Se l'attività è già in esecuzione, la porterà in primo piano invece di creare una nuova attività.

Se si aggiunge Intent.FLAG_ACTIVITY_CLEAR_TOP con questo, tutte le attività successive a questa attività nel backstack verranno cancellate.

+2

Questo è esattamente ciò che non voglio accadere. Se esiste già un'attività sull'attività avviata. Non dovrebbe essere ignorato. –

+1

Questo non sovrascriverà l'attività.Porterà avanti solo l'attività già avviata. –

+2

Intent.FLAG_ACTIVITY_NEW_TASK non funziona per me .. questo avvia sempre una nuova attività .. per favore aiutami –

5

Se l'attività sarà sulla parte superiore, se già iniziato, impostare il flag FLAG_ACTIVITY_SINGLE_TOP

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
mContext.startActivity(intent); 
+0

Ciò è particolarmente utile quando si utilizza una barra laterale/un cassetto e non si desidera aprire un'attività due volte quando si è già in primo piano. – dermatthias

+0

Sto avviando un'attività da un servi utilizzando Intent.FLAG_ACTIVITY_SINGLE_TOP, l'attività non viene avviata e viene visualizzato questo errore: android.util.AndroidRuntimeException: la chiamata di startActivity() dall'esterno di un contesto attività richiede il flag FLAG_ACTIVITY_NEW_TASK. E 'davvero ciò che vuoi? – yeahman

2

Approcci android:launchMode="singleInstance" e solo l'aggiunta di bandiere per il Intent non funzionano per me . Ciò che funziona è che:

Nel codice in cui viene avviato l'attività:

Intent intent = new Intent(activity, ActivityThatHasToBeStarted.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 
startActivity(intent); 

Nella ActivityThatHasToBeStarted:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { 
     finish(); 
     return; 
    } 
    // Code for this creation 
} 
1

Se non avete bisogno di più la seconda attività, è bene pratica per finirlo, quindi si dovrebbe fare questo sulla seconda attività dopo l'operazione è terminata:

startActivity(new Intent(this, FirstActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); 
finish(); 
0

Ti suggerisco di utilizzare Intent.FLAG_ACTIVITY_CLEAR_TOP poiché rimuoverà tutte le attività che iniziano sopra l'attività mirata.

esempio:

Intent intent = new Intent(sourceActivity, Target activity); 

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

startActivity(intent) 
Problemi correlati