【Android代码片段之八】监听Android屏幕是否锁屏
实现方法:1)通过BroadcastReceiver接收广播Intent.ACTION_SCREEN_ON和Intent.ACTION_SCREEN_OFF可以判断屏幕状态是否锁屏,但是只有屏幕状态发生改变时才会发出广播;
2)如果要在屏幕状态发生改变之前就想获取屏幕状态,可以通过反射机制调用PowerManager的isScreenOn方法 。
具体实现,见代码:
实现Screen状态监听的类ScreenObserver,实现如下:
- package com.isoft.screen;
- import java.lang.reflect.Method;
- import android.app.Activity;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.content.IntentFilter;
- import android.os.PowerManager;
- import android.util.Log;
- /**
- *
- * @author zhangyg
- *
- */
- public class ScreenObserver{
- private static String TAG = "ScreenObserver";
- private Context mContext;
- private ScreenBroadcastReceiver mScreenReceiver;
- private ScreenStateListener mScreenStateListener;
- private static Method mReflectScreenState;
- public ScreenObserver(Context context){
- mContext = context;
- mScreenReceiver = new ScreenBroadcastReceiver();
- try {
- mReflectScreenState = PowerManager.class.getMethod("isScreenOn",
- new Class[] {});
- } catch (NoSuchMethodException nsme) {
- Log.d(TAG, "API < 7," + nsme);
- }
- }
- /**
- * screen状态广播接收者
- * @author zhangyg
- *
- */
- private class ScreenBroadcastReceiver extends BroadcastReceiver{
- private String action = null;
- @Override
- public void onReceive(Context context, Intent intent) {
- action = intent.getAction();
- if(Intent.ACTION_SCREEN_ON.equals(action)){
- mScreenStateListener.onScreenOn();
- }else if(Intent.ACTION_SCREEN_OFF.equals(action)){
- mScreenStateListener.onScreenOff();
- }
- }
- }
- /**
- * 请求screen状态更新
- * @param listener
- */
- public void requestScreenStateUpdate(ScreenStateListener listener) {
- mScreenStateListener = listener;
- startScreenBroadcastReceiver();
- firstGetScreenState();
- }
- /**
- * 第一次请求screen状态
- */
- private void firstGetScreenState(){
- PowerManager manager = (PowerManager) mContext
- .getSystemService(Activity.POWER_SERVICE);
- if (isScreenOn(manager)) {
- if (mScreenStateListener != null) {
- mScreenStateListener.onScreenOn();
- }
- } else {
- if (mScreenStateListener != null) {
- mScreenStateListener.onScreenOff();
- }
- }
- }
- /**
- * 停止screen状态更新
- */
- public void stopScreenStateUpdate(){
- mContext.unregisterReceiver(mScreenReceiver);
- }
- /**
- * 启动screen状态广播接收器
- */
- private void startScreenBroadcastReceiver(){
- IntentFilter filter = new IntentFilter();
- filter.addAction(Intent.ACTION_SCREEN_ON);
- filter.addAction(Intent.ACTION_SCREEN_OFF);
- mContext.registerReceiver(mScreenReceiver, filter);
- }
- /**
- * screen是否打开状态
- * @param pm
- * @return
- */
- private static boolean isScreenOn(PowerManager pm) {
- boolean screenState;
- try {
- screenState = (Boolean) mReflectScreenState.invoke(pm);
- } catch (Exception e) {
- screenState = false;
- }
- return screenState;
- }
- public interface ScreenStateListener {
- public void onScreenOn();
- public void onScreenOff();
- }
- }
测试ScreenObserver功能的示例类ScreenObserverActivity,实现如下:
- package com.isoft.screen;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- import com.isoft.screen.ScreenObserver.ScreenStateListener;
- public class ScreenObserverActivity extends Activity {
- private String TAG = "ScreenObserverActivity";
- private ScreenObserver mScreenObserver;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mScreenObserver = new ScreenObserver(this);
- mScreenObserver.requestScreenStateUpdate(new ScreenStateListener() {
- @Override
- public void onScreenOn() {
- doSomethingOnScreenOn();
- }
- @Override
- public void onScreenOff() {
- doSomethingOnScreenOff();
- }
- });
- }
- private void doSomethingOnScreenOn() {
- Log.i(TAG, "Screen is on");
- }
- private void doSomethingOnScreenOff() {
- Log.i(TAG, "Screen is off");
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- //停止监听screen状态
- mScreenObserver.stopScreenStateUpdate();
- }
- }
- http://blog.csdn.net/m_changgong/article/details/7608911
【Android代码片段之八】监听Android屏幕是否锁屏的更多相关文章
- Android EditText截获与监听输入事件
Android EditText截获与监听输入事件共有2种方法: 1.第一种方法:使用setOnKeyListener(),不过这种方式只能监听硬键盘事件. edittext.setOnKeyLi ...
- Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果
转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17761431),请尊重他人的辛勤劳动成果,谢谢! 我之前写 ...
- 监听Android CTS测试项解决方案(二)
二,监听当前测试项是否是Accelerometer Measurement Test测试项 通过第一种方式介绍的,我们可以得到当前处于活动状态的Activity类似监听CTS测试当前的测试项.但是由于 ...
- 监听Android CTS测试项解决方案(一)
前言: 首先这里需要详细叙述一下标题中"监听Android CTS测试项解决方案"的需求.这里的需求是指我们需要精确的监听到当前CTS测试正在测试的测试项. 因为我们知道CTS认证 ...
- Android Back Home键监听
Android Back Home键监听 Back键的监听 对于Back键的监听比较容易,可以在多个系统回调处拦截,比如在activity的下列方法中都可以收到Back键按下的事件: @Overrid ...
- Android addTextChangedListener(文本监听)参数解释及实现EditText字数监听
由于最近做项目要检测EditText中输入的字数长度,从而接触到了Android中EditText的监听接口,TextWatcher.它有三个成员方法,第一个after很简单,这个方法就是在EditT ...
- vue 定义全局函数,监听android返回键事件
vue 定义全局函数,监听android返回键事件 方法一:main.js 注入(1)在main.js中写入函数Vue.prototype.changeData = function (){ aler ...
- Android几行代码实现实时监听微信聊天
实现效果: 实时监听当前聊天页面的最新一条消息,如图: 实现原理: 同样是利用AccessibilityService辅助服务,关于这个服务类还不了解的同学可以先看下我上一篇关于 ...
- Android 监听 Android中监听系统网络连接打开或者关闭的实现代码
本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.c ...
随机推荐
- GCC,GDB,Makefile和IO复用函数
2015.1.22 c高级的环境搭建:GCC编译器:全称 GNU CC,是GNU工具(tool chain)的一种,源码编译成机器码,gcc的编译依赖于很多小工具4.3.3和3.4.3版本的比较稳定 ...
- 第一个Shader的更新,增加爆光度, 属性改为数值型(更直观,精确)
Shader "Castle/ColorMix" { Properties { // 基本贴图 _MainTex ("Texture Image", 2D) = ...
- magento问题集3
MISSING LANGUAGE FILES OR DIRECTORIES A:已经装了俄语包,也是russian目录,在前台也可以用.但是在后台最上面总是显示MISSING LANGUAGE FIL ...
- magento使用google analytics
magento与google的很多功能是无缝集成的,这个展现了magento在seo方面的强大. 用了magento就不用傻到在页面里添加google analytic的跟踪代码了,激活google ...
- C#去除字符串的最后一个字符
字符串:string s = "1,2,3,4,5," 目标:删除最后一个 "," 方法: 1.用的最多的是Substring,这个也是我一直用的 s = s. ...
- cmd命令进行RSA 密钥加密操作
--参考 http://msdn.microsoft.com/zh-cn/library/2w117ede http://msdn.microsoft.com/zh-cn/library/yxw286 ...
- 转linux
随着上班的深入,愈来愈感觉到转linux的必要性,最近做实验室的网页,在windows下是好的, 没想到,传到liunx服务器上,居然出了问题,很是郁闷,平时还是用liunx用的少了. 以后操作系统要 ...
- wireshark使用详解
编号:1009时间:2016年4月29日15:52:44功能:wireshark使用详解URl:http://blog.jobbole.com/70907/URL:http://www.9upk.co ...
- 3des加解密算法
编号:1003时间:2016年4月1日09:51:11功能:openssl_3des加解密算法http://blog.csdn.net/alonesword/article/details/17385 ...
- TruSeq 应该指的是试剂盒名字 NEB
现在中心用的是NEB试剂盒,建库步骤更简单一些.TruSeq和NEB差不多,既可以建DNA又可以建RNA. TruSeq Technology TruSeq technology repres ...