2012-05-31 19 views
10

Ho un'attività che deve attivare lo schermo quando viene avviato (nel caso in cui lo schermo fosse spento). Così nel mio onCreate, ho:Perché viene chiamato onStop subito dopo l'avvio della mia attività?

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
      |WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
      |WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
      |WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 

Utilizzando questa semplice combinazione, sono in grado di causare la mia attività per visualizzare ogni volta che viene avviato dal mio servizio in background (sì, questo è un caso legittima).

Il problema, tuttavia, è che esiste un comportamento del ciclo di vita molto strano quando avvio la mia attività in questo caso. Utilizzando vasto annotare, sono stato in grado di capire che il seguente processo 7-passo accade immediatamente dopo l'attività viene avviata:

  1. onCreate
  2. onStart
  3. onResume
  4. onPause
  5. onStop
  6. onStart
  7. onResume

Vedi che? Per iniziare una semplice attività, onStart viene chiamato due volte. E ancora più importante, onStop viene chiamato misteriosamente, anche se l'attività è appena iniziata e non è successo niente che possa fermarlo.

Ho provato questo in molti scenari diversi e sembra che questo strano comportamento si verifica solo quando lo schermo è spento e l'attività viene avviata dopo che è stata distrutta. Se lo schermo è attivo o se l'attività è stata arrestata [ma non ancora distrutta], l'attività viene avviata normalmente e onStart viene chiamato una sola volta.

Riga inferiore: sembra che quando la mia attività viene avviata e lo schermo sia forzato, Android avvia l'attività, quindi la interrompe, quindi la riavvia senza alcun motivo apparente.

Quindi: perché sta succedendo? E c'è qualcosa che posso fare per risolvere il problema (in modo che onStop non venga chiamato fino a quando non vi è una causa legittima per essere)?


Note:

  • L'attività in questione sta usando il singleTask launchmode
  • Ho provato a rendere invalido il blocco della tastiera/serratura, ma non ha alcun effetto
  • sto assistendo questo comportamento su un Samsung Galaxy Tab 10.1 con Android 3.2. Non ho ancora testato se questo vale per qualsiasi altra cosa ...
+0

Ho un comportamento simile quando è necessario ruotare l'attività. Nel mio caso l'attività ha un orientamento non specificato in AndroidManifest. Durante onCreate ho impostato l'orientamento sulla base della mia macchina a stati. Quando l'orientamento che ho impostato non è quello corrente, il che significa che l'attività deve essere ruotata, vedo lo strano ciclo di vita che hai descritto. Hai trovato la risposta? – kingston

+0

Ho anche verificato che onPostResume venga chiamato prima di onPause. – kingston

+1

La soluzione descritta qui ha funzionato per me: [OnPause e OnStop() chiamati immediatamente dopo l'avvio dell'attività] (http://stackoverflow.com/questions/25369909/onpause-and-onstop-called-immediately-after-starting-activity) – cyberhuman

risposta

-2

Si potrebbe verificare la situazione in onStart, impostare una variabile statica o globale, e quindi controllare la variabile in onStop per ignorare il comportamento standard.

+0

Ma come dovrei differenziare tra casi "buoni" e casi "cattivi" di onStop? – yydl

+0

Controllando la variabile. – Mundi

+0

Sì, ma mentre scrivo, ciò non accade sempre - solo dove lo schermo era spento. Quindi, se lo schermo è attivo, il tuo metodo non funzionerà – yydl

2

Ho avuto un problema simile qui: Activity Lifecycle X Power Button X Lock Screen

Il problema era che la mia attività è stata costretta paesaggio, quando ho acceso lo schermo ha mostrato la schermata di blocco in verticale e si stava causando una modifica alla configurazione e, quindi, distruggere l'attività corrente.

La soluzione era aggiungere un android: configChanges = "orientation" sull'attività nel mio AndroidManifest.xml.

+1

Buona chiamata. Ma c'è un altro da aggiungere: android: configChanges = "keyboardHidden | orientation". Con ICS + avrai bisogno di android: configChanges = "keyboardHidden | orientation | screenSize". –

1

Come suggerito da @cyberhuman, la risposta a questa domanda OnPause and OnStop() called immediately after starting activity mi ha indirizzato nella giusta direzione.

Il mio problema con l'attività che completa un ciclo di vita completo "fittizio" prima di essere effettivamente visualizzato all'utente era che il mio tentativo di riprodurre la suoneria quando l'attività è diventata visibile è stato disattivato direttamente dal successivo "onStop()", e usare i flag per fare in modo che l'attività si comporti correttamente quando viene lanciato quando lo schermo è spento/quando lo schermo è bloccato/quando lo schermo è acceso/quando l'attività è in esecuzione in background non è possibile.

Ho finalmente risolto il problema ignorando il metodo onWindowFocusChanged (boolean hasFocus) e lanciando la suoneria da lì. Mettilo qui nel caso qualcuno abbia lo stesso problema.

Problemi correlati