2010-03-19 31 views
24

在Android 2.2(7级)中,函数PowerManager.IsScreenOn()返回布尔值,如果屏幕打开则返回true;如果关闭屏幕,则返回false。我正在开发Android 1.5(3级)的代码。我如何在老版本的Android中完成相同的任务?如何判断屏幕是否在android中?

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

回答

9

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

54

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

+0

感谢兄弟,这是它! :) – cesarferreira 2013-11-25 04:56:16

+10

return powerManager.isScreenOn(); – 2013-12-02 18:03:31

+0

是的@Sponge,更好的方式,条件是只为无经验的开发者澄清一点,因为他们大多数而不是使用'return true'来添加他们自己的代码。 – 2013-12-03 19:14:49

22

这是你应该怎么做:

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; 
+9

作为f优雅。 .. – 2015-03-13 15:38:33

+0

不错的一个。谢谢。 – MegaAppBear 2016-06-10 21:04:31

2

我张贴这一点,因为在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(); 
} 
4

我使用下面的函数:

public boolean isInteractive() { 
    PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); 
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH 
     ? powerManager.isInteractive() 
     : powerManager.isScreenOn(); 
} 
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 "); 
     } 
    } 
} 
+0

我认为你应该使用'switch(arg1.getAction()){/ * content * /}'而不是'if else'块 – NatNgs 2017-02-15 15:53:26

相关问题