在Android 2.2(7级)中,函数PowerManager.IsScreenOn()
返回布尔值,如果屏幕打开则返回true;如果关闭屏幕,则返回false。我正在开发Android 1.5(3级)的代码。我如何在老版本的Android中完成相同的任务?如何判断屏幕是否在android中?
我不想在我的代码中打开或关闭屏幕。我只想知道它是什么。
在Android 2.2(7级)中,函数PowerManager.IsScreenOn()
返回布尔值,如果屏幕打开则返回true;如果关闭屏幕,则返回false。我正在开发Android 1.5(3级)的代码。我如何在老版本的Android中完成相同的任务?如何判断屏幕是否在android中?
我不想在我的代码中打开或关闭屏幕。我只想知道它是什么。
您可以通过为ACTION_SCREEN_ON
和ACTION_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_DOZE
和STATE_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<VERSION_CODES.KITKAT_WATCH&&powerManager.isScreenOn();
return result;
作为f优雅。 .. – 2015-03-13 15:38:33
不错的一个。谢谢。 – MegaAppBear 2016-06-10 21:04:31
我张贴这一点,因为在HUAWAI棱镜II的Android 4.1.1(API 16)设备的游戏我的工作(http://www.playlunapuma.com )有以下恼人的行为:
我正在显示我的主菜单,它在SurfaceView中有一些动画,并在一段时间播放声音。 设备闲置,变暗,然后变暗。 它在我的活动上调用onDestroy
,然后在屏幕关闭时再次创建我的活动,调用onCreate
! 所以问题是我的动画和声音在屏幕关闭时播放。我真正想要发生的是,如果屏幕关闭,我的动画循环根本不能运行。广播接收器不工作,因为我无法存储上次屏幕熄灭时的状态。我想过一些涉及静态布尔值的黑客,但它看起来像是一个可能不起作用的边缘案例,并且有可怕的边缘案例。当我的活动再次创建时,屏幕已经关闭,所以我不会通过广播接收器收到我的屏幕关闭的事件。
我使用广播接收机和上面列出的代码解决了这个问题。我的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();
}
我使用下面的函数:
public boolean isInteractive() {
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH
? powerManager.isInteractive()
: 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 ");
}
}
}
我认为你应该使用'switch(arg1.getAction()){/ * content * /}'而不是'if else'块 – NatNgs 2017-02-15 15:53:26
感谢兄弟,这是它! :) – cesarferreira 2013-11-25 04:56:16
return powerManager.isScreenOn(); – 2013-12-02 18:03:31
是的@Sponge,更好的方式,条件是只为无经验的开发者澄清一点,因为他们大多数而不是使用'return true'来添加他们自己的代码。 – 2013-12-03 19:14:49