开发者

How can I tell if the screen is on in android?

In Android 2.2 (Level 7) the function PowerManager.IsScreenOn() returns a boolean that is true if the screen is turned on and false if the screen is turned off. I am developing code for Android 1.5 (Level 3). How do I accomplish the same task in older versions of Android?

I do not want 开发者_如何学JAVAto turn the screen on or off in my code. I just want to know what it is.


There's a better way than using BroadcastReceivers:

// If you use API20 or more:
DisplayManager dm = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
for (Display display : dm.getDisplays()) {
    if (display.getState() != Display.STATE_OFF) {
        return true;
    }
}
return false;

// If you use less than API20:
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
if (powerManager.isScreenOn()){ return true; }

Note that Display.getState() can also return STATE_DOZE and STATE_DOZE_SUSPEND which means that the screen is on in an special way. More info on Display.getState() and his return values here: http://developer.android.com/reference/android/view/Display.html#getState()

Also note that although official documentation recommends using isInteractive() instead of isScreenOn(), if you really want to know the status of the screen, Display.getState() is a better option because of the 'special' conditions that sets the screen on while the device is not interactive.


This is how you should do it:

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
boolean result= VERSION.SDK_INT>=VERSION_CODES.KITKAT_WATCH&&powerManager.isInteractive()||VERSION.SDK_INT<VERSION_CODES.KITKAT_WATCH&&powerManager.isScreenOn();
return result;


I'm using the following function:

public boolean isInteractive() {
    PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH 
        ? powerManager.isInteractive() 
        : powerManager.isScreenOn();
}


You can accomplish this by setting up broadcast receivers for ACTION_SCREEN_ON and ACTION_SCREEN_OFF.


I'm posting this because on a HUAWAI Prism II Android 4.1.1 (API 16) device the game I'm working on (http://www.playlunapuma.com) had the following annoying behavior:

I'm displaying my main menu which has some animation in a SurfaceView and plays a sound once in a while. The device goes idle, dims, and then goes dark. It calls onDestroy on my Activity, and then while the screen is off creates my Activity again, calling onCreate! So the problem is my animations and sounds are playing while the screen is off. What I really want to happen is for my animation loop to not run at all if the screen is off. Broadcast receivers don't work because I can't store the state from the last time the screen went off. I thought about some hacks involving static booleans but it just seemed like a kluge that may not work and have horrible edge cases. The screen is already off when my Activity is created again, so I won't get an event through the broadcast receiver that my screen is off.

I solved this using both a broadcast receiver and the code listed above.

In my onCreate, I create the broadcast receiver. This will control my animation loop when the screen turns on and off.

if (mScreenReceiver == null) {
    mScreenIntentFilter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    mScreenIntentFilter.addAction(Intent.ACTION_SCREEN_OFF);
    mScreenReceiver = new ScreenReceiver();
    registerReceiver(mScreenReceiver, mScreenIntentFilter);
}
public class ScreenReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {                
            controlAnimLoop(false, false, true);
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            controlAnimLoop(false, false, false);
        }
    }

}

In my controlAnimLoop, I check isScreenOn, which is this code:

private boolean isScreenOn() {
    if (android.os.Build.VERSION.SDK_INT >= 20) {
        // I'm counting                                                                                                                
        // STATE_DOZE, STATE_OFF, STATE_DOZE_SUSPENDED                                                                                 
        // all as "OFF"                                                                                                                

        DisplayManager dm = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
        for (Display display : dm.getDisplays ()) {
            if (display.getState () == Display.STATE_ON ||
                display.getState () == Display.STATE_UNKNOWN) {
                return true;
            }
        }

        return false;
    }

    PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);

    return powerManager.isScreenOn();
}


MainActivity.Java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_HEADSET_PLUG);
        filter.addAction(Intent.ACTION_POWER_CONNECTED);
        filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
        filter.addAction(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);

        registerReceiver(new MyReceiver(), filter);
    }
}

MyReciever.Java

public class MyReceiver extends BroadcastReceiver {

    MainActivity mActivity;

    @Override
    public void onReceive(Context arg0, Intent arg1) {

        mActivity = (MainActivity) arg0;

        TextView tv = (TextView)mActivity.findViewById(R.id.textView1);

        if(arg1.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
            tv.setText("Headset Plugin ");
        } else if(arg1.getAction().equals(Intent.ACTION_POWER_CONNECTED)) {
            tv.setText("Power Connected  ");
        } else if(arg1.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)) {
            tv.setText("Power Disconnected  ");
        } else if(arg1.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            tv.setText("Screen ON ");
        } else if(arg1.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            tv.setText("Screen OFF ");
        }   
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜