web-dev-qa-db-fra.com

comment vérifier l'état de marche / arrêt de l'écran dans onStop ()?

comme mentionné ici , lorsque l'écran s'éteint, la onStop() de l'activité en cours sera appelée. Je dois vérifier l'état de marche/arrêt de l'écran lorsque la onStop() de mon Activity est appelée. j'ai donc enregistré un BroadcastReceiver pour ces actions (ACTION_SCREEN_ON ET ACTION_SCREEN_OFF) pour enregistrer l'état actuel marche/arrêt (et ils fonctionnent correctement, je me suis connecté!).
mais lorsque j'éteins l'écran et vérifie l'état d'activation/désactivation dans onStop, cela indique que l'écran est allumé. Pourquoi? Je pense que le récepteur doit recevoir le ACTION_SCREEN_OFF avant onStop est appelé, alors qu'est-ce qui ne va pas?

24
Soheil

Vous pouvez essayer d'utiliser le service système PowerManager à cet effet, voici un exemple et documentation officielle (notez que cette méthode a été ajoutée dans l'API niveau 7):

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

ÉDITER:

la méthode isScreenOn () est obsolète API niveau 21. Vous devez utiliser isInteractive à la place:

boolean isScreenOn = pm.isInteractive();

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

59
Alexander Semenov
PowerManager pm = (PowerManager) mMainActivity.getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = Utils.hasLollipop() ? pm.isInteractive() : pm.isScreenOn();
1
Mary Seo

Comme mentionné dans cette réponse à une question similaire. Dans l'API 21 et au-dessus, nous pouvons utiliser le DisplayManager pour déterminer l'état de l'affichage. Cela a l'avantage de prendre en charge l'interrogation de plusieurs écrans:

DisplayManager dm = (DisplayManager) 
context.getSystemService(Context.DISPLAY_SERVICE);
for (Display display : dm.getDisplays()) {
    if (display.getState() != Display.STATE_OFF) {
        return true;
    }
}
return false;

Selon votre situation, il peut être plus approprié d'interroger l'affichage sur lequel une vue particulière est affichée:

myView.getDisplay().getState() != Display.STATE_OFF
1
Rem-D