实现方法: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. PHP url重定向

    1.使用header()函数 PHP的 HTTP相关函数种提供了一个 header()函数,首先要清楚,header()函数必须放在php程序的开头部分,而且之前不能有另外的 header() 函数或 ...

  2. Linux基础入门(新版)(实验九-实验十二)

    实验九 简单文本入门 一.常用的文本处理命令 二.文本处理命令 1.tr 命令 tr 命令可以用来删除一段文本信息中的某些文字.或者将其进行转换. 使用方式: tr [option]...SET1 [ ...

  3. 直接用bat命令对Inno Setup的脚本文件.iss进行编译

    直接用bat命令对Inno Setup的脚本文件.iss进行编译 2010-06-17 15:17 qjn0059 | 浏览 2163 次 编程语言外语学习 分享到:   2010-06-29 11: ...

  4. [!!!!!]Inno Setup教程-常见问题解答

    [转]Inno Setup教程-常见问题解答 功能 * 翻译 Inno Setup 文字  * 它支持 MBCS (多字节字符集) 吗?  * 将来会支持 Windows Installer 吗?   ...

  5. 我的第一个unity3d Shader, 很简单,基本就是拷贝

    Shader "Castle/ColorMix" { Properties { // 基本贴图 _MainTex ("Texture Image", 2D) = ...

  6. uninstall gitlab

    Stop gitlab and remove its supervision process sudo gitlab-ctl uninstall Debian/Ubuntu sudo dpkg -r ...

  7. 《MORE EFFECTIVE C++》条款27 要求或者禁止对象分配在堆上

    1. 要求对象分配在堆上 临时对象一般是存在于栈中的,或者是静态对象存在于常量存储区的.那么当创建一个这样的对象的时候,一般是需要隐式或显式地调用构造函数,在销毁的时候调用析构函数的.可以从这方面入手 ...

  8. LeetCode Permutations (全排列)

    题意: 给出n个元素,请产生出所有的全排列. 思路: 注意到可能会有相同的排列出现,比如 {2,2}.还有可能是乱序列(大部分情况下都是无所谓的). 递归(1):产生的过多的多余vector. cla ...

  9. 《JS高程》JS-Object对象整理

    继上篇<JS高程>对象&原型笔记,对JavaScript中的Object对象进行了整理,梳理一遍~ 参考文章:详解Javascript中的Object对象 ------------ ...

  10. 二叉搜索树(Binary Search Tree)

    二叉搜索树(BST,Binary Search Tree),也称二叉排序树或二叉查找树. 二叉搜索树:一棵二叉树,可以为空:如果不为空,满足以下性质: 非空左子树的所有键值小于其根结点的键值: 非空右 ...