2013-10-13 8 views
20

jak wspomniano here, kiedy ekran się wyłączy, zostanie wywołana onStop() aktualnej aktywności. Muszę sprawdzić stan włączenia/wyłączenia ekranu po wywołaniu onStop() mojego. więc zarejestrowałem BroadcastReceiver dla tych działań (ACTION_SCREEN_ON ORAZ ACTION_SCREEN_OFF), aby zapisać bieżący stan włączenia/wyłączenia (i działają one poprawnie, mam zarejestrowane!).
, ale kiedy wyłączam ekran i sprawdzam stan włączenia/wyłączenia w onStop, oznacza to, że ekran jest włączony. czemu? Myślę, że odbiornik musi otrzymać ACTION_SCREEN_OFF przed onStop nazywa się, co jest nie tak?jak sprawdzić stan włączenia/wyłączenia ekranu w onStop()?

+1

"Myślę, że odbiornik musi odebrać ACTION_SCREEN_OFF przed wywołaniem funkcji onStop, więc co jest nie tak?" - Nie mam pojęcia, dlaczego byś to założył. Użyj instrukcji 'Log' lub punktów przerwania, aby zobaczyć, która z nich zostanie wywołana jako pierwsza. Co więcej, przeprojektuj aplikację, aby nie przejmowała się tym, czy 'onStop()' jest wywoływana, ponieważ ekran jest wyłączany, w porównaniu z jakimkolwiek innym powodem. – CommonsWare

+0

@CommonsUrządzenie musi mieć możliwość odróżnienia się w różnych sytuacjach, w których 'onStop' jest wywoływany, więc muszę wiedzieć, czy wyłączenie ekranu spowodowało wywołanie' onStop' lub inną rzecz. jakieś lepsze rozwiązanie? – Soheil

+0

"aplikacja musi być w stanie odróżnić się od różnych sytuacji, w których onStop jest wywoływany" - dlaczego? Jaką różnicę wpływa na aplikację, czy ekran jest wyłączony, czy użytkownik nacisnął HOME, czy użytkownik nacisnął BACK, czy użytkownik wykonał przychodzące połączenie telefoniczne, czy użytkownik stuknął w powiadomienie, czy użytkownik zrobił coś innego to spowodowało, że twoja działalność przestała być widoczna? Wyłączanie ekranu zwykle nie jest przypadkiem specjalnym. – CommonsWare

Odpowiedz

41

Można spróbować użyć usługę systemową PowerManager do tego celu, jest tu przykładem i official documentation (uwaga ta metoda została dodana w poziomie API 7):

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

EDIT

:

isScreenOn (metoda) jest przestarzała poziom API 21. należy używać isInteractive zamiast:

boolean isScreenOn = pm.isInteractive(); 

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

+2

doskonały Alexander! 'BroadcastReceiver' nie otrzymał akcji w momencie, kiedy chciałem, ale ten się udało :) – Soheil

+0

' pm.isScreenOn() 'jest przestarzałe. –

+0

@SuperThomasLab Czego użyć zamiast tego? –

Powiązane problemy