【Android代码片段之八】监听Android屏幕是否锁屏

实现方法:1)通过BroadcastReceiver接收广播Intent.ACTION_SCREEN_ON和Intent.ACTION_SCREEN_OFF可以判断屏幕状态是否锁屏,但是只有屏幕状态发生改变时才会发出广播;

2)如果要在屏幕状态发生改变之前就想获取屏幕状态,可以通过反射机制调用PowerManager的isScreenOn方法 。

具体实现,见代码:

实现Screen状态监听的类ScreenObserver,实现如下:

[java] view plaincopy

  1. package com.isoft.screen;
  2. import java.lang.reflect.Method;
  3. import android.app.Activity;
  4. import android.content.BroadcastReceiver;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.content.IntentFilter;
  8. import android.os.PowerManager;
  9. import android.util.Log;
  10. /**
  11. *
  12. * @author zhangyg
  13. *
  14. */
  15. public class ScreenObserver{
  16. private static String TAG = "ScreenObserver";
  17. private Context mContext;
  18. private ScreenBroadcastReceiver mScreenReceiver;
  19. private ScreenStateListener mScreenStateListener;
  20. private static Method mReflectScreenState;
  21. public ScreenObserver(Context context){
  22. mContext = context;
  23. mScreenReceiver = new ScreenBroadcastReceiver();
  24. try {
  25. mReflectScreenState = PowerManager.class.getMethod("isScreenOn",
  26. new Class[] {});
  27. } catch (NoSuchMethodException nsme) {
  28. Log.d(TAG, "API < 7," + nsme);
  29. }
  30. }
  31. /**
  32. * screen状态广播接收者
  33. * @author zhangyg
  34. *
  35. */
  36. private class ScreenBroadcastReceiver extends BroadcastReceiver{
  37. private String action = null;
  38. @Override
  39. public void onReceive(Context context, Intent intent) {
  40. action = intent.getAction();
  41. if(Intent.ACTION_SCREEN_ON.equals(action)){
  42. mScreenStateListener.onScreenOn();
  43. }else if(Intent.ACTION_SCREEN_OFF.equals(action)){
  44. mScreenStateListener.onScreenOff();
  45. }
  46. }
  47. }
  48. /**
  49. * 请求screen状态更新
  50. * @param listener
  51. */
  52. public void requestScreenStateUpdate(ScreenStateListener listener) {
  53. mScreenStateListener = listener;
  54. startScreenBroadcastReceiver();
  55. firstGetScreenState();
  56. }
  57. /**
  58. * 第一次请求screen状态
  59. */
  60. private void firstGetScreenState(){
  61. PowerManager manager = (PowerManager) mContext
  62. .getSystemService(Activity.POWER_SERVICE);
  63. if (isScreenOn(manager)) {
  64. if (mScreenStateListener != null) {
  65. mScreenStateListener.onScreenOn();
  66. }
  67. } else {
  68. if (mScreenStateListener != null) {
  69. mScreenStateListener.onScreenOff();
  70. }
  71. }
  72. }
  73. /**
  74. * 停止screen状态更新
  75. */
  76. public void stopScreenStateUpdate(){
  77. mContext.unregisterReceiver(mScreenReceiver);
  78. }
  79. /**
  80. * 启动screen状态广播接收器
  81. */
  82. private void startScreenBroadcastReceiver(){
  83. IntentFilter filter = new IntentFilter();
  84. filter.addAction(Intent.ACTION_SCREEN_ON);
  85. filter.addAction(Intent.ACTION_SCREEN_OFF);
  86. mContext.registerReceiver(mScreenReceiver, filter);
  87. }
  88. /**
  89. * screen是否打开状态
  90. * @param pm
  91. * @return
  92. */
  93. private static boolean isScreenOn(PowerManager pm) {
  94. boolean screenState;
  95. try {
  96. screenState = (Boolean) mReflectScreenState.invoke(pm);
  97. } catch (Exception e) {
  98. screenState = false;
  99. }
  100. return screenState;
  101. }
  102. public interface ScreenStateListener {
  103. public void onScreenOn();
  104. public void onScreenOff();
  105. }
  106. }

测试ScreenObserver功能的示例类ScreenObserverActivity,实现如下:

[java] view plaincopy

    1. package com.isoft.screen;
    2. import android.app.Activity;
    3. import android.os.Bundle;
    4. import android.util.Log;
    5. import com.isoft.screen.ScreenObserver.ScreenStateListener;
    6. public class ScreenObserverActivity extends Activity {
    7. private String TAG = "ScreenObserverActivity";
    8. private ScreenObserver mScreenObserver;
    9. @Override
    10. public void onCreate(Bundle savedInstanceState) {
    11. super.onCreate(savedInstanceState);
    12. setContentView(R.layout.main);
    13. mScreenObserver = new ScreenObserver(this);
    14. mScreenObserver.requestScreenStateUpdate(new ScreenStateListener() {
    15. @Override
    16. public void onScreenOn() {
    17. doSomethingOnScreenOn();
    18. }
    19. @Override
    20. public void onScreenOff() {
    21. doSomethingOnScreenOff();
    22. }
    23. });
    24. }
    25. private void doSomethingOnScreenOn() {
    26. Log.i(TAG, "Screen is on");
    27. }
    28. private void doSomethingOnScreenOff() {
    29. Log.i(TAG, "Screen is off");
    30. }
    31. @Override
    32. protected void onDestroy() {
    33. super.onDestroy();
    34. //停止监听screen状态
    35. mScreenObserver.stopScreenStateUpdate();
    36. }
    37. }
    38. http://blog.csdn.net/m_changgong/article/details/7608911
时间: 2024-10-22 04:30:17

【Android代码片段之八】监听Android屏幕是否锁屏的相关文章

Android 监听 Android中监听系统网络连接打开或者关闭的实现代码

本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.content.BroadcastReceiver;  import android.content.Context;  import android.content.Intent;  import android.net.ConnectivityManager;  import android.ne

Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

我之前写了一篇关于美团网,大众点评的购买框效果的文章Android对ScrollView滚动监听,实现美团.大众点评的购买悬浮效果,我自己感觉效果并不是很好,如果快速滑动界面,显示悬浮框的时候会出现一卡的现象,有些朋友说有时候会出现两个布局的情况,特别是对ScrollView滚动的Y值得监听,我还使用了Handler来获取,还有朋友给我介绍了Scrolling Tricks这个东西,我下载试了下,确实美团网,大众点评的购买框用的是这种效果,但是Scrolling Tricks只能在API11以上

Android EditText截获与监听输入事件

Android EditText截获与监听输入事件共有2种方法: 1.第一种方法:使用setOnKeyListener(),不过这种方式只能监听硬键盘事件. edittext.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { textview.setText(edittext.getText()); return fal

Android中检查、监听电量和充电状态的方法

Android中检查.监听电量和充电状态的方法 这篇文章主要介绍了Android中检查.监听电量和充电状态的方法,如判断当前充电状态.监听充电状态的改变.判断当前剩余电量等,需要的朋友可以参考下 当你在更改后台更新频率来减少这些更新对电池寿命的影响时,检查当前电量和充电状态是一个好的开始. 电池寿命通过剩余电量和充电状态来影响应用更新的执行.当用交流电充电时,执行更新操作对设备的影响是微不足道的,所以在大多数案例里,你可以把更新频率调到最快.如果设备不在充电,降低更新频率可以帮助延长电池寿命.

[android] 网络断开的监听

标签: android 网络监听 杂谈 分类: Android [转自]  http://blog.sina.com.cn/s/blog_5d5996d001012o07.html 其实手机在网络方面的的监听也比较重要,有时候我们必须实时监控这个程序的实时网络状态,android在网络断开与连接的时候都会发出广播,我们通过接收系统的广播就可以实现网络的监听,下面是代码--- onCreate的时候实例化 //监听器     private NetState receiver=new NetSta

Android短信数据库监听回调多次问题

在监听Android短信数据库变化时.由于只能注册content://sms/ 的observer.所以,在数据库每次状态变化的时候,都会多次回调onChange 方式.目前还未找到很好的方式,解决回调多次的问题.只能通过代码逻辑来屏蔽这个问题. 目前,我使用的方式是通过时间来过滤两次的回调. long lastTimeofCall = 0L;    long lastTimeofUpdate = 0L;    long threshold_time = 10000; if (lastTimeo

Android学习按键事件监听与Command模式

Android学习按键事件监听与Command模式 - Dufresne - 博客园 ? 一 Command模式 意图: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化: 对请求排队或记录请求日志,以及支持可撤销的操作. 将请求被封装成一个对象,当向某对象提交请求时,使我们可以不用去知道被具体的请求的操作或者请求的接收者, 实现了动作的请求者对象和动作的执行者对象之间的解耦合. 适用性: 使用Command模式代替callback形式的回调应用: 在不同的时刻指定.排列和执行请

监听Android CTS测试项解决方案(二)

二,监听当前测试项是否是Accelerometer Measurement Test测试项 通过第一种方式介绍的,我们可以得到当前处于活动状态的Activity类似监听CTS测试当前的测试项.但是由于是监听Android系统中所有Activity,因此会大大降低系统的性能,因此这里有一种效率更高的方式来精确定位当前CTS正在测试的测试项,而不会对系统造成很大的影响.(当然不能修改CTS源码,我们需要使用Android提供的原生CTS APK进行验证) 那么我们这里以Accelerometer M

Android Back Home键监听

Android Back Home键监听 Back键的监听 对于Back键的监听比较容易,可以在多个系统回调处拦截,比如在activity的下列方法中都可以收到Back键按下的事件: @Override public void onBackPressed() { // super.onBackPressed();//注释掉这行,back键不退出activity Log.i(LOG_TAG, "onBackPressed"); } @Override public boolean dis