2013-10-13 12 views
20

come menzionato here, quando lo schermo si spegne, verrà chiamato il onStop() dell'attività corrente. Devo controllare lo stato di attivazione/disattivazione dello schermo quando viene chiamato lo onStop() del mio Activity. quindi ho registrato un BroadcastReceiver per queste azioni (ACTION_SCREEN_ON E ACTION_SCREEN_OFF) per registrare lo stato on/off corrente (e funzionano correttamente, ho effettuato l'accesso!).
ma quando spengo lo schermo e controllo lo stato on/off nel onStop, si dice che lo schermo è acceso. perché? Penso che il ricevitore debba ricevere lo ACTION_SCREEN_OFF prima che venga chiamato onStop quindi cosa c'è che non va?come controllare lo stato di attivazione/disattivazione dello schermo in onStop()?

+1

"Penso che il ricevitore debba ricevere ACTION_SCREEN_OFF prima che venga chiamato onStop, quindi cosa c'è che non va?" - Non ho idea del perché lo daresti per scontato. Usa le istruzioni del 'Log', o punti di interruzione, per vedere quale viene chiamato per primo. Meglio ancora, ridisegnare la tua app per non preoccuparsi se 'onStop()' viene chiamato perché lo schermo è spento, rispetto a qualsiasi altro motivo. – CommonsWare

+0

@CommonsWare l'app deve essere in grado di distinguere tra le diverse situazioni in cui 'onStop' viene chiamato in loro, quindi devo sapere se lo spegnimento dello schermo ha causato il richiamo di' onStop' o un'altra cosa. qualche soluzione migliore? – Soheil

+0

"l'app deve essere in grado di distinguere tra le diverse situazioni in cui onStop viene chiamato in loro" - perché? Che differenza fa alla tua app se lo schermo è spento, o se l'utente ha premuto HOME, o se l'utente ha premuto BACK, o se l'utente ha ricevuto una chiamata in arrivo, o l'utente ha toccato una notifica, o l'utente ha fatto qualcos'altro che ha reso la tua attività non più visibile? Normalmente lo spegnimento dello schermo non è un caso speciale. – CommonsWare

risposta

41

È possibile tenta di utilizzare servizio di sistema PowerManager per questo scopo, qui è l'esempio e official documentation (notare che questo metodo è stato aggiunto nel livello di API 7): Metodo

isScreenOn():

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
boolean isScreenOn = pm.isScreenOn(); 

EDIT è deprecato livello di API 21. Si consiglia di utilizzare isInteractive invece:

boolean isScreenOn = pm.isInteractive(); 

http://developer.android.com/reference/android/os/PowerManager.html#isInteractive()

+2

ottimo Alessandro! il 'BroadcastReceiver' non ha ricevuto le azioni nel momento in cui volevo ma questo lo ha reso :) – Soheil

+0

' pm.isScreenOn() 'è deprecato. –

+0

@SuperThomasLab Cosa usare invece? –

Problemi correlati