androidandroid-activityandroid-broadcast

how to check screen on/off status in onStop()?


as mentioned here, when the screen goes off, the onStop() of current Activity will be called. I need to check the screen on/off status when the onStop() of my Activity is called. so I have registered a BroadcastReceiver for these actions(ACTION_SCREEN_ON AND ACTION_SCREEN_OFF) to record the current on/off status(and they work properly, I have logged!).
but when I turn off the screen and check the on/off status in the onStop , it says the screen is on. why? I think the receiver must receive the ACTION_SCREEN_OFF before onStop is called so what's wrong?


Solution

  • You can try to use PowerManager system service for this purpose, here is example and official documentation (note this method was added in API level 7):

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

    EDIT:

    isScreenOn() method is deprecated API level 21. You should use isInteractive instead:

    Java:

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

    Kotlin:

    val pm = applicationContext.getSystemService(Context.POWER_SERVICE) as PowerManager
    var isScreenOn = pm.isInteractive
    

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