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:
- onCreate
- onStart
- onResume
- onPause
- onStop
- onStart
- 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 ...
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
Ho anche verificato che onPostResume venga chiamato prima di onPause. – kingston
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