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

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

具体实现,见代码:

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

  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,实现如下:

    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

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

  1. Android EditText截获与监听输入事件

      Android EditText截获与监听输入事件共有2种方法: 1.第一种方法:使用setOnKeyListener(),不过这种方式只能监听硬键盘事件. edittext.setOnKeyLi ...

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

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17761431),请尊重他人的辛勤劳动成果,谢谢! 我之前写 ...

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

    二,监听当前测试项是否是Accelerometer Measurement Test测试项 通过第一种方式介绍的,我们可以得到当前处于活动状态的Activity类似监听CTS测试当前的测试项.但是由于 ...

  4. 监听Android CTS测试项解决方案(一)

    前言: 首先这里需要详细叙述一下标题中"监听Android CTS测试项解决方案"的需求.这里的需求是指我们需要精确的监听到当前CTS测试正在测试的测试项. 因为我们知道CTS认证 ...

  5. Android Back Home键监听

    Android Back Home键监听 Back键的监听 对于Back键的监听比较容易,可以在多个系统回调处拦截,比如在activity的下列方法中都可以收到Back键按下的事件: @Overrid ...

  6. Android addTextChangedListener(文本监听)参数解释及实现EditText字数监听

    由于最近做项目要检测EditText中输入的字数长度,从而接触到了Android中EditText的监听接口,TextWatcher.它有三个成员方法,第一个after很简单,这个方法就是在EditT ...

  7. vue 定义全局函数,监听android返回键事件

    vue 定义全局函数,监听android返回键事件 方法一:main.js 注入(1)在main.js中写入函数Vue.prototype.changeData = function (){ aler ...

  8. Android几行代码实现实时监听微信聊天

    实现效果: 实时监听当前聊天页面的最新一条消息,如图:            实现原理: 同样是利用AccessibilityService辅助服务,关于这个服务类还不了解的同学可以先看下我上一篇关于 ...

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

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

随机推荐

  1. swift SDWebImage使用

    Web image(网络图像) 该库提供了一个支持来自Web的远程图像的UIImageView类别它提供了: 添加网络图像和缓存管理到Cocoa Touch framework的UIImageView ...

  2. 11、SQL基础整理(变量)

    变量 定义变量:declare  @hello  varchar(20) 赋值:set  @hello = ‘你好’ select(结果框显示)/print(消息框显示) @hello *三行必须同时 ...

  3. 著名的安装制作软件InnoSetup的源码及示例源码-The installation of a well-known software s source code and sample InnoSetup source

    @echo off rem Inno Setup rem Copyright (C) 1997-2007 Jordan Russell rem Portions by Martijn Laan rem ...

  4. Selenium - IWebDriver 控制scroll bar到底部

    有时候我们需要控制页面滚动条上的滚动条,但滚动条并非页面上的元素,这个时候就需要借助js是来进行操作.一般用到操作滚动条的会两个场景: 注册时的法律条文需要阅读,判断用户是否阅读的标准是:滚动条是否拉 ...

  5. Qt的quit(),exit()以及close()事件捕获

         使用QT编辑界面,其中带来很大方便的一点就是Qt中自带丰富的.种类齐全的类及其功能函数,程序员可以在编辑程序的过程中简单地直接调用.关于窗口关闭的操作,在这里指出常用的三个槽,即quit() ...

  6. hexo —— 简单、快速、强大的Node.js静态博客框架

    hexo是一款基于Node.js的静态博客框架.目前在GitHub上已有1375 star 和 219 fork. 特性 风一般的速度 Hexo基于Node.js,支持多进程,几百篇文章也可以秒生成. ...

  7. js foreach比for多出两个undefined

    项目中发现,javascript 用foreach会比for多出两个undefined, //会多两个undefined for (var i in _SysFunctions_S) {} //正常 ...

  8. mysql 操作突然断网,MySQL: “lock wait timeout exceeded”

    show processlist;//显示所有进程select * from information_schema.innodb_trx;//查询锁的进程-- kill 310;//杀掉锁进程

  9. 资源预加载 Preload

    当提到前端性能优化时,我们首先会联想到文件的合并.压缩,文件缓存和开启服务器端的 gzip 压缩等,这使得页面加载更快,用户可以尽快使用我们的 Web 应用来达到他们的目标. 资源预加载 是另一个性能 ...

  10. sgu551 Preparing Problem

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=551 呵呵,题目读的没错,可惜理解错了..== #include <cstdi ...