如何判断屏幕是否在android中?

时间:2010-03-19 00:58:10

标签: android

在Android 2.2(第7级)中,函数PowerManager.IsScreenOn()返回一个布尔值,如果屏幕打开则为true,如果屏幕关闭则为false。我正在为Android 1.5(Level 3)开发代码。如何在旧版Android中完成相同的任务?

我不想在我的代码中打开或关闭屏幕。我只是想知道它是什么。

6 个答案:

答案 0 :(得分:63)

有一种比使用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; }

请注意,Display.getState()也可以返回STATE_DOZESTATE_DOZE_SUSPEND,这意味着屏幕会以特殊方式启用。有关Display.getState()的更多信息及其返回值:http://developer.android.com/reference/android/view/Display.html#getState()

另请注意,虽然官方文档建议使用isInteractive()而不是isScreenOn(),但如果您真的想知道屏幕的状态,Display.getState()是更好的选择,因为&# 39;特'在设备不是交互式时设置屏幕的条件。

答案 1 :(得分:26)

这是你应该怎么做的:

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;

答案 2 :(得分:8)

您可以通过为ACTION_SCREEN_ONACTION_SCREEN_OFF设置广播接收器来实现此目的。

答案 3 :(得分:8)

我使用以下功能:

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

答案 4 :(得分:3)

我发布这个是因为在 HUAWAI Prism II Android 4.1.1 (API 16)设备上我正在处理的游戏(http://www.playlunapuma.com)有以下恼人的行为:

我正在显示我的主菜单,它在SurfaceView中有一些动画并且偶尔会播放声音。 设备闲置,变暗,然后变暗。 它在我的Activity上调用onDestroy,然后在屏幕关闭时 再次创建我的Activity,调用onCreate! 所以问题是我的动画和声音在屏幕关闭时播放。我真正想要的是,如果屏幕关闭,我的动画循环根本不会运行。广播接收器不起作用,因为我无法存储屏幕上次关闭时的状态。我想到了一些涉及静态布尔值的黑客,但它看起来像是一个可能不起作用并且有可怕的边缘情况的kluge。当我的Activity再次创建时,屏幕已经关闭,所以我不会通过广播接收器获取我的屏幕关闭的事件。

我使用广播接收器和上面列出的代码解决了这个问题。

在我的onCreate中,我创建了广播接收器。当屏幕打开和关闭时,这将控制我的动画循环。

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);
        }
    }

}

在我的controlAnimLoop中,我检查isScreenOn,这是代码:

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();
}

答案 5 :(得分:0)

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 ");
        }   
    }
}