Android - Screen On / Offイベントの受信、状態確認

By JS | Last updated: December 23, 2020

Androidは画面が点灯または消灯する ACTION_SCREEN_ONACTION_SCREEN_OFFインテントをブロードキャストで送信します。 アプリでは、このインテントを受けて、デバイスの画面がオンか、オフか知ることができます。

BroadcastReceiver登録

暗黙的(Implicit)ブロードキャスト制限ポリシーでは、ターゲットが決まっていないが、暗黙的インテントは、Contextに登録されたレシーバーのみ渡されます。つまり、AndroidManifestに登録されたレシーバは、インテントを受け取ることができなくなります。このポリシーは、Target API 26以上のアプリにのみ適用されます。

したがって、 ACTION_SCREEN_ONACTION_SCREEN_OFFインテントを受信するには、次のように Context.registerReceiver()で動的に登録する必要があります。

val intentFilter = IntentFilter(Intent.ACTION_SCREEN_OFF)
    intentFilter.addAction(Intent.ACTION_SCREEN_ON)
val receiver = object: BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        val action = intent!!.action
        Log.d("Test", "receive : $action")

        when (action) {
            Intent.ACTION_SCREEN_ON -> {
                // do something
            }
            Intent.ACTION_SCREEN_OFF -> {
                // do something
            }
        }
    }
}

registerReceiver(receiver, intentFilter);

Power keyにScreen off / onをすると、次のように出力されます。

12-23 16:31:36.922 21799 21799 D Test    : receive : android.intent.action.SCREEN_OFF
12-23 16:31:38.331 21799 21799 D Test    : receive : android.intent.action.SCREEN_ON

PowerManager.isInteractive()でScreen On状態の確認

isInteractive()は、画面がオンになっている場合はtrueを返し、オフになっている場合、falseを返します。

val pm = getSystemService(Context.POWER_SERVICE) as PowerManager
if (pm.isInteractive) {
    // screen on
} else {
    // screen off
}

PowerManager.isScreenOn() APIもScreen onの状態を返します。このAPIは、deprecatedされたため、 PowerManager.isInteractive()を使用します。

Related Posts

codechachaCopyright ©2019 codechacha