Detecting Screen On/Off State in Android Applications

In Android application development, there are two primary approaches to monitor device screen status:

Method 1: Using PowerManager APIs

The PowerManager service provides direct methods to query screen state:

import android.os.Build;
import android.os.PowerManager;

PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
boolean screenAwake;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
    screenAwake = powerManager.isInteractive();
} else {
    screenAwake = powerManager.isScreenOn();
}

This approach offers immediate status checking at any point in your application lifecycle.

Method 2: Broadcast Receiver Registration

For real-time monitoring, register reecivers for system broadcast intents:

private void setupDisplayListener() {
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(Intent.ACTION_SCREEN_ON);
    intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
    
    DisplayStateReceiver receiver = new DisplayStateReceiver();
    registerReceiver(receiver, intentFilter);
}

private class DisplayStateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String receivedAction = intent.getAction();
        
        if (Intent.ACTION_SCREEN_ON.equals(receivedAction)) {
            handleScreenActivation();
        } else if (Intent.ACTION_SCREEN_OFF.equals(receivedAction)) {
            handleScreenDeactivation();
        }
    }
}

Complete Implementation Example

package com.example.screenmonitor;

import androidx.appcompat.app.AppCompatActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import android.os.PowerManager;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ScreenMonitorActivity extends AppCompatActivity {
    private static final String LOG_TAG = "ScreenMonitor";
    private DisplayStateReceiver displayReceiver;
    private TextView statusDisplay;
    private StringBuilder statusLog = new StringBuilder();
    private StringBuilder lifecycleLog = new StringBuilder();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        statusDisplay = findViewById(R.id.status_view);
        queryCurrentScreenState();
        initializeDisplayListener();
        logLifecycleEvent("onCreate");
    }

    private void queryCurrentScreenState() {
        PowerManager powerMgr = (PowerManager) getSystemService(Context.POWER_SERVICE);
        boolean isActive;
        
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
            isActive = powerMgr.isInteractive();
        } else {
            isActive = powerMgr.isScreenOn();
        }
        
        updateStatusDisplay(isActive ? "ACTIVE" : "INACTIVE");
    }

    private void initializeDisplayListener() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        
        displayReceiver = new DisplayStateReceiver();
        registerReceiver(displayReceiver, filter);
    }

    private class DisplayStateReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            
            if (Intent.ACTION_SCREEN_ON.equals(action)) {
                updateStatusDisplay("ACTIVATED");
            } else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
                updateStatusDisplay("DEACTIVATED");
            }
        }
    }

    private String getCurrentTimestamp() {
        SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss.SSS");
        return formatter.format(new Date());
    }

    private void logLifecycleEvent(String event) {
        String timestamp = getCurrentTimestamp();
        lifecycleLog.append(String.format("[%s] %s: %s\n", timestamp, "Activity", event));
    }

    private void updateStatusDisplay(String state) {
        String timestamp = getCurrentTimestamp();
        statusLog.append(String.format("[%s] Display Status: %s\n", timestamp, state));
        statusDisplay.setText(statusLog.toString());
    }
}

Execution Output

[20:00:09:591] Display Status: ACTIVE
[20:00:09:594] Activity: onCreate
[20:00:09:603] Activity: onStart
[20:00:09:606] Activity: onResume
[20:00:16:793] Activity: onPause
[20:00:16:850] Activity: onStop
[20:00:17:795] Display Status: DEACTIVATED
[20:00:18:564] Display Status: ACTIVATED
[20:00:20:536] Activity: onRestart
[20:00:20:543] Activity: onStart
[20:00:20:552] Activity: onResume
[20:00:26:360] Activity: onPause
[20:00:26:393] Activity: onStop
[20:00:27:570] Display Status: DEACTIVATED

Tags: Android PowerManager BroadcastReceiver Screen State Mobile Development

Posted on Tue, 28 Jul 2026 16:49:17 +0000 by DickDeeds