前述のように here 、画面がオフになると、現在のアクティビティのonStop()
が呼び出されます。 Activity
のonStop()
が呼び出されたときに画面のオン/オフのステータスを確認する必要があります。だから私はこれらのアクションのためにBroadcastReceiver
を登録しました(ACTION_SCREEN_ON
AND ACTION_SCREEN_OFF
)現在のオン/オフのステータスを記録します(そして、それらは正しく機能します。ログに記録しました!)。
しかし、画面をオフにしてonStop
でオン/オフのステータスを確認すると、画面がオンになっていると表示されます。どうして?レシーバーはACTION_SCREEN_OFF
onStop
が呼び出される前に、何が問題になっていますか?
この目的のために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()
PowerManager pm = (PowerManager) mMainActivity.getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = Utils.hasLollipop() ? pm.isInteractive() : pm.isScreenOn();
この答え で述べたように、同様の質問に。 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