实现方法: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. 【LeetCode】172. Factorial Trailing Zeroes

    Factorial Trailing Zeroes Given an integer n, return the number of trailing zeroes in n!. Note: Your ...

  2. JQuery源码分析(五)

    分离构造器 通过new 操作符构建一个对象,一般经过四部:   A.创建一个新对象   B.将构造函数的作用域赋给新对象(所以this就指向了这个新对象)   C.执行构造函数中的代码   D.返回这 ...

  3. 初始React Native

    1.何是React Native: React-Native是:Facebook 在2015年初React.js技术研讨大会上公布的一个开源项目.支持用开源的JavaScript库React.js来开 ...

  4. ios openURL的使用(调用系统电话、浏览器、地图、邮件等)

    Safari Any URL starting with http:// which does not point to maps.google.com or www.youtube.com is s ...

  5. HDU 1080

    http://acm.hdu.edu.cn/showproblem.php?pid=1080 二维最长公共子序列 #include <iostream> #include <cstd ...

  6. (理论篇)温故而知新_PHP入门基础教程

    简单的回顾一下基础知识 1.嵌入方法: 类似ASP的<%,PHP可以是<?php或者是<?,结束符号是?>,当然您也可以自己指定. 2.引用文件: 引用文件的方法有两种:req ...

  7. UI学习笔记---第六天

    UIControl及其子类 UISegmentedControl的用法 UISegmentedControl是iOS中得分段控件,每个segment都能被点击,相当于集成了若干个button.通常我们 ...

  8. Apache CXF 101 Win Eclipse开发环境搭建

    前言 博客草稿中“SOA生态系统初探”一文一直没有进展,感觉要将SOA.Web Service(WS).REST等概念阐述清楚还需要一些酝酿. 顶天须得立地,这里记录一些“下里巴人”的实践,主要考察A ...

  9. db2 存储过程 语法 及结果集查询

    第一次用存储过程,关于处理待办的,不知道怎么执行和传参数 给存储过程 ,其实就一句话很简单. @call PRC_MISSIONLIST_QUERY('27020214', '27040000', ' ...

  10. ZOJ 1076 Gene Assembly

    原题链接 题目大意:首先学习一个生物学的单词,exon:外显子,DNA序列中能够翻译表达的片段.给出很多外显子的起始点和终点,求寻找包含最多外显子的一条链,并且输出这些外显子的编号. 解法:先把所有外 ...