web-dev-qa-db-ja.com

onStop()で画面のオン/オフ状態を確認する方法

前述のように here 、画面がオフになると、現在のアクティビティのonStop()が呼び出されます。 ActivityonStop()が呼び出されたときに画面のオン/オフのステータスを確認する必要があります。だから私はこれらのアクションのためにBroadcastReceiverを登録しました(ACTION_SCREEN_ON AND ACTION_SCREEN_OFF)現在のオン/オフのステータスを記録します(そして、それらは正しく機能します。ログに記録しました!)。
しかし、画面をオフにしてonStopでオン/オフのステータスを確認すると、画面がオンになっていると表示されます。どうして?レシーバーはACTION_SCREEN_OFFonStopが呼び出される前に、何が問題になっていますか?

24
Soheil

この目的のためにPowerManagerシステムサービスを使用してみることができます。以下に例と 公式ドキュメント を示します(このメソッドはAPIレベル7で追加されたことに注意してください)。

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

編集:

isScreenOn()メソッドは非推奨のAPIレベル21です。代わりにisInteractiveを使用する必要があります。

boolean isScreenOn = pm.isInteractive();

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

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

この答え で述べたように、同様の質問に。 API 21以降では、DisplayManagerを使用して表示の状態を判別できます。これには、複数のディスプレイのクエリをサポートするという利点があります。

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

状況によっては、特定のビューが表示されているディスプレイを照会する方が適切な場合があります。

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