【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 ...
随机推荐
- Mac快捷键 Xcode快捷键
Mac OSX 快捷键&命令行 一.Mac OSX 快捷键 ctrl+shift 快速放大dock的图标会暂时放大,而 ...
- 破解 crackme4(深入底层抓出关键算法)
系统 : Windows xp 程序 : crackme4 程序下载地址 :http://pan.baidu.com/s/1nu452xN 要求 : 注册机编写 使用工具 : OD & IDA ...
- C++类的运用 和 三大函数
在<数据结构与算法分析C++描述>一书中给出了三段代码,简单描述了C++类的接口.实现.与调用: #ifndef INTCELL_H_INCLUDED #define INTCELL_H_ ...
- CentOS下启动Tomcat
http://tianlihu.iteye.com/blog/2010028 1. Tomcat的部署包存放的路径 /var/lib/tomcat6/webapps/ 2. Tomcat的配置文件路 ...
- 微软官方好用的Office 2003、 Office 2007 或 Office 2010 卸载工具
http://support.microsoft.com/kb/2519420/zh-cn
- setSelection()和requestFocusFromTouch()
昨天我遇到一个问题,点击返回的时候要在onResume()中用setSelection()定位到刚才点击的item,因为点击item进入后,我又一直点击“下一个”按钮,但是返回的时候listview不 ...
- 十一 SOA 与 ESB
一 SOA 1. 定义: a) 一种充分利用开放标准,将软件资产展现为服务的结构. b) 提供软件资产标准的展现和交互途径 c) 在开发其他应用的时候,可以将独立的软件资产封装为一个一个的“积木”. ...
- hdu 5091 Beam Cannon
题目大意: 有n个点(n<=10000),点的坐标绝对值不超过20000,然后问你用一个w*h(1<=w,h<=40000)的矩形,矩形的边平行于坐标轴,最多能盖住多少个点. 刘汝佳 ...
- codeforce Group Photo 2 (online mirror version)
题目大意: 有n个矩形在地上排成一列,不可重叠,已知他们的宽度w和高度h,现在使至多[n / 2]个矩形旋转90度,问最后可以用多小的矩形恰好覆盖这n个矩形,求满足条件的最小矩形面积. n, w, h ...
- JavaWeb学习记录(十九)——jsp标签库
1.out标签 <% //局部变量 String name="zsf>&<zz"; pageContext.se ...