Android — Come gestire correttamente onPause/onResume metodi?

Ho un app che inizia la riproduzione di suoni e inizia o riprende il gameplay in onResume() il metodo, ma quello che sto notando è che se la mia app è stata l’ultima applicazione che quando metto il telefono in standby (schermo spento), e mi basta premere il pulsante Menu per controllare il tempo, poi il telefono inizia a giocare il gioco e suoni in background (l’app non è in realtà visibile, solo la schermata con la data/l’ora, ma onResume deve essere stata nella mia app). Che cosa sto a fare qui? C’è un modo per discernere ciò che è riattivare l’app, e quindi aggiungere un’istruzione condizionale che solo all’inizio del gioco quando l’app è in realtà visibile?

Ecco un frammento del mio onResume:

@Override
    protected void onResume()
    {
        mySaveGame = Utilities.loadSavegame(this);

        //check the savegame
        if(mySaveGame!=null)
        {
            //start game using savegame values
            this.startFromSavedGame(mySaveGame.getIsLevelComplete());   
        }
        else
        {
            //run the 1st-run components
            this.startFirstRun();
        }

        super.onResume();
    }

L’unica cosa che posso pensare di fare per evitare che il gioco a partire ogni volta che lo schermo si accende (anche quando l’applicazione non è visibile) è quello di fare questo.fine() come ultima riga onPause()… ma che ti costringe a riavviare l’app ogni volta che si desidera tornare indietro perché la precedono stesso è stato ucciso (che è un bene, perché il mio onPause salva i dati in modo persistente, ma non è una soluzione elegante).

Si prega di aiuto.

InformationsquelleAutor RyanM | 2010-04-22

 

2 Replies
  1. 8

    Hai preso in considerazione il passaggio a onStart() e onStop(), piuttosto che onResume() e onPause()?

    • Grazie per la risposta. Ho provato onStart()/onStop(), ma ottenere gli stessi risultati… il gioco si gioca in background anche quando non è in realtà visibile. Secondo la documentazione, onStart() viene chiamato prima onResume() (ecco perché non funziona nel mio caso) e onStop() “non può mai essere chiamato…”
    • Hmmmm… Che suona come la schermata di blocco non è propriamente essere considerato come il primo piano. Quale dispositivo stai testando questo?
    • Io sto usando un T-Mobile G1 (Android 1.6 firmware stock).
    • Posso confermare che il T-Mobile G1 (Android 1.6) e il Nexus One (Android 2.1) per mettere in pausa la app in primo piano quando lo schermo è spento e riprenderà l’app quando il blocco viene visualizzata la schermata dopo che lo schermo è acceso. Tuttavia, onStop() e onStart() non sono chiamati. Quindi, si dovrebbe modificare il codice per utilizzare onStop() e onStart() piuttosto che onPause() e onResume().
    • Va bene, così ho provato a spostare tutto a onStart() di nuovo. Che permette la schermata di blocco di apparire e non avviare il gioco in background (non so cosa ho fatto nel mio primo tentativo con onStart() che hanno reso produrre la stessa cosa come onResume()). Ho un problema ora. Dopo lo spostamento di tutto il codice per la onStart(), e quando si riprende dalla schermata di blocco (premendo il tasto Menu due volte), il gioco non si avvia… cioè onStart() non viene mai chiamato di nuovo, dopo l’iniziale onCreate().
    • Sì, non c’è dubbio che la schermata di blocco, come è implementato, confonde le questioni. Una soluzione hack si può provare è quello di registerReceiver() per ACTION_SCREEN_OFF. A questo punto, pop un AlertDialog, qualcosa per l’effetto di “Giocare sospeso” con il “resume” e “chiudi” pulsanti. Si tocca “resume”, e fuoco la logica è di solito fare in onStart(). Si tocca “vicino”, e si finish() la tua attività. O qualcosa di simile.
    • Ok, ho capito la logica dietro a quello che suggerisci, ma non ho mai provato a implementare un BroadcastReceiver. Ho trovato questo: stackoverflow.com/questions/1324307/… (ho capito che, per esempio). È che qualcosa di simile a quello che stai suggerendo? Grazie.
    • Accettato di rispondere a questa domanda è quello che avevo in mente, sì.
    • Ok, proverò a farlo fuori. Grazie per il vostro aiuto.
    • Hai usato onPause per il salvataggio di stato e di interrompere il gioco?

  2. 4

    Ho avuto lo stesso problema (ho avuto il mio lettore musicale resume/pausa a onResume()/onPause()) e la migliore soluzione che ho trovato è quello di mettere in pausa e riprendere la mia attività quando è sul primo piano che si può ottenere con public void onWindowFocusChanged (boolean hasFocus) richiamata.

    Edit: Questo in un vecchio e leggermente risposta errata corretta risposta è descritto nella Sviluppatori Android Blog: rendendo i giochi android che bel gioco

    • Avete notato che su alcuni dispositivi onWidowFocusChanged con hasFocus==false verrà chiamato quando si modifica il volume?
    • Dal momento che il mio post, Google ha fornito un’alternativa migliore che si occupa di tale problema correttamente su tutti i dispositivi/firmware, ho modificato il mio post originale qui sopra.

Lascia un commento