Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何判断android中的屏幕是否打开?_Android - Fatal编程技术网

如何判断android中的屏幕是否打开?

如何判断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

在Android 2.2(7级)中,函数
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 ");
        }   
    }
}