2010-02-17 4 views
44

sto affrontando esattamente il problema menzionato in questi link:App inizia sempre fresco dall'attività radice invece di riprendere stato di fondo (bug noto)

http://code.google.com/p/android/issues/detail?id=2373

http://groups.google.com/group/android-developers/browse_thread/thread/77aedf6c7daea2ae/da073056831fd8f3?#da073056831fd8f3

http://groups.google.com/group/android-developers/browse_thread/thread/2d88391190be3303?tvc=2

I avere una semplice attività di root con gli intenti LAUNCHER e MAIN e nient'altro. Inizio un'altra attività con senza bandiere o altro nel manifest.

Lancio l'app (attività root) e da lì inizia la 2a attività. Premendo il tasto Home, l'attività passa allo sfondo. Quando si avvia nuovamente l'app (da Avvio o tenendo premuto il pulsante Home per le app recenti), viene avviata una nuova istanza dell'attività root in cima allo stack esistente.

Se premo il pulsante Indietro, la nuova attività "root" si chiude e la vecchia 2a attività è visibile, il che significa che avvia l'attività root nella stessa attività invece di portare l'attività in primo piano.

Per contrastare ciò ho avviato l'avvio dell'attività root Modalità singleTask. Ora quando premo home e lancia nuovamente l'app, cancella le attività sopra la vecchia attività di root e porta la vecchia attività di root in primo piano invece di portare l'intera vecchia attività con la 2a attività in primo piano. Si noti che il vecchio task di root conserva ancora il suo stato di applicazione, il che significa che non era una nuova istanza, ma che le attività più elevate erano state eliminate.

Si verifica anche su altre applicazioni scaricate dal mercato. Il metodo di installazione manuale non ha alcun effetto per me, si avvia comunque allo stesso modo.

+0

Kurian, ho affrontato lo stesso problema. C'è qualche workaroun? Grazie in anticipo. –

+1

Basta continuare a premere indietro e uscire completamente dall'applicazione dopo averlo distribuito da Eclipse. Lanciarlo di nuovo dal telefono. – Monstieur

+0

Possibile duplicato di [Problemi di ordinamento stack attività all'avvio dell'applicazione dal programma di installazione di app Android e dalla schermata Home] (http: // stackoverflow.it/questions/6356467/activity-stack-ordering-problem-when-launch-application-from-android-app-inst) – blahdiblah

risposta

24

Ciò è dovuto agli intenti utilizzati per avviare l'applicazione in modo diverso. Eclipse avvia un'app utilizzando un intent senza azione e senza categoria. Il Launcher avvia un'app utilizzando un intent con android.intent.action.MAIN action e android.intent.category.LAUNCHER category. Il programma di installazione avvia un'applicazione con l'azione android.intent.action.MAIN e nessuna categoria.

Chi ha presentato il bug avrebbe dovuto probabilmente formulata come una richiesta di miglioramento per il plugin di Eclipse dal momento che a quanto pare vogliono Eclipse per avere la possibilità di far finta di essere il programma di avvio e di avviare le applicazioni utilizzando lo stesso intento come il lanciatore.

+2

Il problema tuttavia persiste anche quando si avvia l'applicazione direttamente dal telefono ... – Monstieur

+1

Sì, Kurian ha ragione - questo non è solo un problema di plugin di Eclipse. Lo stesso accade sul dispositivo con l'aggiornamento OTA. Questo è il problema Android più strano che ho affrontato. Non posso credere che sia ancora un nuovo problema in fase di creazione 1 anno fa !!! –

+1

Non sembra che questo sia stato risolto fino ad oggi. Hmmm ... chiedo cosa fanno davvero le persone laggiù? –

57
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { 
     // Activity was brought to front and not created, 
     // Thus finishing this will get us to the last viewed activity 
     finish(); 
     return; 
    } 

    // Regular activity creation code... 
} 
+5

Questo è così ritardato, non la tua soluzione, ma il problema per cominciare. – JohnyTex

+0

Si tratta di un bug o è di proposito? - il modo in cui Android ha impostato questo – Micro

+3

non ha funzionato per me, quindi ho cambiato 'android: launchMode =" singleInstance "' per 'android: launchMode =" singleTask "' e ha funzionato :) –

5

ecco la soluzione:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0 & getIntent().getExtras() == null) { 
     finish(); 
     return; 
    } 

Your code.... 
} 

EDIT: ho avuto problemi con nuovi intenti e notifiche. La soluzione precedente non funziona con le notifiche e gli intenti ...

0

soluzione simile per Xamarin.Android:

if (!IsTaskRoot) 
      { 
       string action = this.Intent.Action; 
       if (this.Intent.HasCategory(Intent.CategoryLauncher) && !string.IsNullOrEmpty(this.Intent.Action) && action == Intent.ActionMain) 
       { 
        Finish(); 
        return; 
       } 
      } 
+0

dove scrivere questo codice? –

+0

@HimanshuDwivedi questo è per un bug molto vecchio, non ne hai più bisogno – CDrosos

Problemi correlati