如何判断android中的屏幕是否打开?
在Android 2.2(7级)中,函数如何判断android中的屏幕是否打开?,android,Android,在Android 2.2(7级)中,函数PowerManager.IsScreenOn()返回一个布尔值,如果屏幕打开,则返回true;如果屏幕关闭,则返回false。我正在为Android 1.5(3级)开发代码。如何在旧版本的Android中完成相同的任务 我不想在代码中打开或关闭屏幕。我只想知道它是什么。您可以通过设置广播接收器和操作屏幕\u关闭有一种比使用广播接收器更好的方法: // If you use API20 or more: DisplayManager dm = (Displ
PowerManager.IsScreenOn()
返回一个布尔值,如果屏幕打开,则返回true;如果屏幕关闭,则返回false。我正在为Android 1.5(3级)开发代码。如何在旧版本的Android中完成相同的任务
我不想在代码中打开或关闭屏幕。我只想知道它是什么。您可以通过设置广播接收器和
操作屏幕\u关闭
有一种比使用广播接收器更好的方法:
// 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\u DOZE
和STATE\u DOZE\u SUSPEND
,这意味着屏幕以特殊方式打开。有关Display.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;
PowerManager-PowerManager=(PowerManager)getSystemService(POWER\u服务);
布尔结果=VERSION.SDK_INT>=VERSION_code.KITKAT_WATCH&powerManager.isInteractive()| VERSION.SDK_INT我之所以发布此消息,是因为在华威Prism II安卓4.1.1(API 16)设备上,我正在开发的游戏()有以下恼人的行为:
我正在显示我的主菜单,它在SurfaceView中有一些动画,并偶尔播放一次声音。
设备闲置、变暗,然后变暗。
它在“我的活动”上调用onDestroy
,然后在屏幕关闭时调用,再次创建我的活动,调用onCreate
!
所以问题是我的动画和声音在屏幕关闭时播放。我真正想要的是,如果屏幕关闭,我的动画循环根本不会运行。广播接收器不工作,因为我无法存储上次屏幕关闭时的状态。我曾想过一些涉及静态布尔值的黑客,但它看起来像一个可能不起作用的kluge,并且有可怕的边缘情况。当我的活动再次创建时,屏幕已经关闭,因此我不会通过广播接收器接收到屏幕关闭的事件
我使用广播接收器和上面列出的代码解决了这个问题
在我的onCreate
中,我创建了广播接收器。这将在屏幕打开和关闭时控制动画循环
if (mScreenReceiver == null) {
mScreenIntentFilter = new IntentFilter(Intent.ACTION_SCREEN_ON);
mScreenIntentFilter.addAction(Intent.ACTION_SCREEN_OFF);
mScreenReceiver = new ScreenReceiver();
registerReceiver(mScreenReceiver, mScreenIntentFilter);
}
在我的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
Java
返回powerManager.isScreenOn();是的@海绵,更好的方式,条件只是为了让没有经验的开发人员更清楚一点,因为大多数开发人员没有使用return true
,而是会添加自己的代码。在新的三星S7中,有一个状态称为“始终打开”功能-他们在屏幕上显示时钟-必须添加Disaply.FLAG_PRIVATE以忽略此类情况,否则您将返回true@GalRom你能提供一个使用Display.FLAG_PRIVATE的代码片段吗?我认为你应该使用switch(arg1.getAction()){/*content*/}
而不是if else
block这实际上是不正确的,如文档中所述“此广播是在设备变得交互式时发送的,这可能与屏幕打开无关”
public boolean isInteractive() {
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH
? powerManager.isInteractive()
: powerManager.isScreenOn();
}
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);
}
}
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 ");
}
}
}