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

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

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

Solutions Collecting From Web of "如何判断屏幕是否在android中?"

您可以通过为ACTION_SCREEN_ONACTION_SCREEN_OFF设置广播接收器来完成此操作。

有一种比使用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()是一个更好的选择,因为设置屏幕的’特殊’条件而设备不是交互式的。

这是你应该怎么做的:

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

我正在使用以下function:

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

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

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

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

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

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

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