2015-02-18 8 views
6

Ho due attività e desidero passare da una all'altra senza ricrearle o duplicarle. Ogni attività ha un pulsante che invierà l'utente all'altro utilizzando un intento con FLAG_ACTIVITY_REORDER_TO_TOP.FLAG_ACTIVITY_REORDER_TO_TOP che causa RuntimeException o schermo nero a rotazione

Questa grande opera, tranne per la seguente condizione:

  1. avviare l'applicazione fresca dopo una forza vicino
  2. premere il pulsante per andare all'attività 2
  3. premere il pulsante per tornare all'attività 1
  4. ruota lo schermo.

A questo punto, l'app si arresta in modo anomalo con "Esecuzione dell'arresto dell'attività non ripristinata". Lollipop mostra solo uno schermo nero.

Stranamente, se si passa alla schermata iniziale prima del passaggio 4 e si riprende l'app e quindi si ruota la condizione precedente non si verificano problemi e l'app funziona correttamente finché non viene chiusa/riavviata.

Questa condizione sembra specifica per FLAG_ACTIVITY_REORDER_TO_TOP e si verifica su Android 5.0 e 4.4 e solo su un nuovo inizio.

Non ho attributi sulle attività nel manifest. I layout appena hanno un pulsante che chiama un metodo che assomiglia a questo:

MainActivity: 
public void goSecond(View v) { 
     Intent i = new Intent(this, SecondActivity.class); 
     i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
     startActivity(i); 
} 

SecondActivity: 
    public void goFirst(View v) { 
     Intent i = new Intent(this, MainActivity.class); 
     i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
     startActivity(i); 
    } 

Io non sono l'override altri metodi del ciclo di vita o di fare qualsiasi altra cosa.

Qualche idea?

risposta

0

Caso interessante, se si esegue il debug dei metodi del ciclo di vita, è possibile vedere che, ruotando lo schermo, viene chiamato onStop, senza . L'incidente registra quindi

java.lang.RuntimeException: Performing pause of activity that is not resumed: MainActivity 

seguito da

java.lang.RuntimeException: Performing stop of activity that is not resumed: MainActivity 

Suppongo che sia un bug nel quadro. È interessante notare che questo sembra solo verificarsi con la bandiera FLAG_ACTIVITY_REORDER_TO_FRONT.

al momento di scrivere ho appena trovato questo post, che mostra chiaramente che ci sembra essere un difetto principale con questo flag: Is any alternate of Intent.FLAG_ACTIVITY_REORDER_TO_FRONT (notare la menzionata Bug biglietteria Android)


Soluzione: Se si sta dependend sul comportamento FLAG_ACTIVITY_REORDER_TO_FRONT ti dà, e si vuole imitare esso (o quasi), è possibile utilizzare

i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

invece (tuttavia, funziona sl ightly differently - cancella lo stack sopra l'attività chiamata, invece di riordinarlo, in modo da avere almeno 1 ricreazione di attività).

Un'altra opzione è quella di giocare con l'attributo launchMode nella definizione dell'attività nel manifest.launchMode="singleInstance" potrebbe essere quello che stai cercando (comunque questo incasina con lo stack delle attività, quindi gestisci con cautela)

Dopo tutto, se il tuo progetto lo consente, considera i frammenti per evitare del tutto questi problemi.

Problemi correlati