2010-08-04 13 views
19

Informazioni: Il mio dispositivo è un Nexus One con 2.2 e ho testato due progetti, uno su 1.5 e uno su 2.1.Problemi di comprensione del ciclo di vita quando lo schermo si spegne e si accende

Problema: Ho problemi a capire il ciclo di vita della mia applicazione quando lo schermo è spento e acceso.

Qui è la mia uscita

// activity starts 
08-04 17:24:17.643: ERROR/PlayActivity(6215): onStart executes ... 
08-04 17:24:17.643: ERROR/PlayActivity(6215): onResume executes ... 
// screen goes off 
08-04 17:24:28.943: ERROR/PlayActivity(6215): onPause executes ... 
08-04 17:24:32.113: ERROR/PlayActivity(6215): onStop executes ... 
08-04 17:24:32.113: ERROR/PlayActivity(6215): onDestroy executes ... 
08-04 17:24:32.983: ERROR/PlayActivity(6215): onStart executes ... 
08-04 17:24:32.983: ERROR/PlayActivity(6215): onResume executes ... 
08-04 17:24:32.983: ERROR/PlayActivity(6215): onPause executes ... 
// screen goes on 
08-04 17:24:47.683: ERROR/PlayActivity(6215): onResume executes ... 
// lock removed 
08-04 17:24:56.943: ERROR/PlayActivity(6215): onPause executes ... 
08-04 17:24:59.663: ERROR/PlayActivity(6215): onStop executes ... 
08-04 17:24:59.663: ERROR/PlayActivity(6215): onDestroy executes ... 
08-04 17:25:00.943: ERROR/PlayActivity(6215): onStart executes ... 
08-04 17:25:00.943: ERROR/PlayActivity(6215): onResume executes ... 

Sono totalmente confuso. Perché riavviare l'attività quando lo schermo si spegne? E perché fermarsi e riavviarlo di nuovo quando lo schermo era già acceso e solo il lucchetto è stato rimosso?

Per essere sicuro di non aver fatto nulla di male, ho creato un nuovo progetto con solo questa attività. L'uscita è identicamente ...

public class LifeCycleTest extends Activity { 

    private final static String DEBUG_TAG = "FirstLifeLog"; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.e(DEBUG_TAG, "onCreate executes ..."); 
     setContentView(R.layout.main); 
    } 

    protected void onRestart() { 
     super.onRestart(); 
     Log.e(DEBUG_TAG, "onRestart executes ..."); 
    } 

    protected void onStart() { 
     super.onStart(); 
     Log.e(DEBUG_TAG, "onStart executes ..."); 
    } 

    protected void onResume() { 
     super.onResume(); 
     Log.e(DEBUG_TAG, "onResume executes ..."); 
    } 

    protected void onPause() { 
     super.onPause(); 
     Log.e(DEBUG_TAG, "onPause executes ..."); 
    } 

    protected void onStop() { 
     super.onStop(); 
     Log.e(DEBUG_TAG, "onStop executes ..."); 
    } 

    protected void onDestroy() { 
     super.onDestroy(); 
     Log.e(DEBUG_TAG, "onDestroy executes ..."); 
    } 
} 

Qualcuno ha un'idea?

Aggiornamento da oggi (non capisco perché non si comporta come l'ultima volta, forse più risorse libere?)

// activity starts 
08-09 12:14:03.122: ERROR/FirstLifeLog(15406): onCreate executes ... 
08-09 12:14:03.132: ERROR/FirstLifeLog(15406): onStart executes ... 
08-09 12:14:03.132: ERROR/FirstLifeLog(15406): onResume executes ... 
// screen off 
08-09 12:14:07.412: ERROR/FirstLifeLog(15406): onPause executes ... 
// screen on 
08-09 12:14:11.722: ERROR/FirstLifeLog(15406): onResume executes ... 
// no log for removed screen lock 
+0

Che è strano è che io vedo OnDestroy() onStart(), chiamate, onResume() ma non vedo alcun onCreate() chiama. Sono anche interessato a capire il comportamento. –

+0

Questo perché il mio onCreate ha mancato l'istruzione del registro ... Anche io l'ho provato di nuovo oggi ... ora il mio gioco ha lo stesso comportamento, ma il testproject ha il comportamento previsto (vedi l'aggiornamento) – WarrenFaith

risposta

-2

Vedi Activity Lifecycle documentazione per una buona descrizione del ciclo di vita, con i diagrammi.

Molto probabilmente la tua attività viene uccisa quando lo schermo si spegne per risparmiare risorse (carica della batteria). Come afferma la documentazione, puoi praticamente essere ucciso ogni volta che Android vuole liberare risorse. Quindi, dovresti sempre progettare le tue attività per poter essere fermato e riavviato in qualsiasi momento.

+1

Conosco la documentazione del ciclo di vita. L'uccisione per risparmiare risorse non può essere la ragione perché viene riavviata immediatamente. E questo è esattamente il mio problema. Non capisco perché viene ucciso e riavviato immediatamente. Ho memorizzare un sacco nel database quando viene attivato l'OnDestroy() ... L'applicazione inutile distrugge risultati in tempi lunghi respond ... – WarrenFaith

+0

Capisco ... Non ho effettivamente testato questa teoria, ma la documentazione discute alcuni configChanges: http://developer.android.com/reference/android/R.attr.html#configChanges che causano l'applicazione per essere riavviato. È possibile che accendere e spegnere lo schermo si adatti a uiMode? Indipendentemente da ciò, potresti voler vedere se puoi rendere onDestroy più efficiente. Forse salva lo stato in tutto, quindi c'è meno da salvare a quel punto? –

0

Questo è il modo. Se leggi il ciclo di vita delle attività vedrai che i passaggi sono praticamente ordinati in quel modo. Non è solo quando lo schermo si accende e si spegne, ma anche quando si brucia la temperatura del telefono. Android ha ricreato l'attività seguendo esattamente i passaggi che hai menzionato sopra. Prova a ruotare lo schermo, lo vedrai! =)

+0

Credo che la vostra predacament è molto simile alla situazione che ho menzionato sopra. Deve avere qualcosa con le viste che vengono cambiate così l'attività viene uccisa e ricreata per funzionare senza schermo! È solo una mia ipotesi ... – Shouvik

30

Ho avuto lo stesso problema con il mio gioco. Il mio gioco funziona solo in orizzontale, e quando si spegne lo schermo, lo screensaver di Android prende il controllo (in modalità verticale), inviando così un cambio di orientamento che distrugge e ricrea l'attività.

Una soluzione semplice è quella di dichiarare che vi gestire se stessi schermo cambia orientamento:

<activity ... android:configChanges="orientation" ... > 

Questo è abbastanza facile se la vostra attività è dichiarato di essere solo paesaggio (quello che dovete fare niente), ma può ottenere più difficile se la tua attività può ruotare ...

+0

Grazie! Mi ci sarebbe voluto del tempo per scoprirlo. Può confermare che cosa è happing con paesaggio app: ricreato una volta per il cambiamento di ritratto, ricreato secondo tempo dopo il ritorno da schermo spento. Anche le cose di configChanges funzionano. Questo dovrebbe essere correttamente (prominente) documentato. – oberstet

+3

Questo probabilmente dovrebbe essere concepito come la risposta accettata, poiché sebbene sia arrivato un mese dopo identifica la causa di ciò che è rimasto misterioso nell'altro. –

+0

Qualcuno sa * come * per rilevare un simile ciclo di vita? Intendo dire che onStop viene chiamato solo a causa dello spegnimento dello schermo e che onStart verrà eseguito presto. – Snicolas

4

Ruben's answer è completamente corretto, ma solo se l'applicazione ha come target il livello API 12 o inferiore.

Ma dal momento che il livello di API 13 in aggiunta all'opzione orientation, si deve dichiarare l'opzione screenSize, perché anche viene attivato quando un dispositivo passa tra il ritratto e gli orientamenti del paesaggio:

<activity ... android:configChanges="orientation|screenSize" ... > 

Altrimenti , la tua attività verrebbe ricreata un tempo aggiuntivo quando lo schermo si spegne sull'API 13 o su una piattaforma più alta.

Per riferimento, vedere le note di sezione API docs, android:configChanges.

Problemi correlati