【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 ...
随机推荐
- Net作业调度-----Quartz.Net
一:业务需求: 项目需要在不同时刻,执行一个或很多个不同的作业. Windows执行计划这时并不能很好的满足需求了,迫切需要一个更为强大,方便管理,集群部署的作业调度框架. 二:介绍 Quartz一个 ...
- Fish入门
安装以及配置 Linux和OS X基本都可以通过源来安装,实在不行就下载源码编译,不难的. 安装好第一步是修改OS默认shell: chsh -s /usr/bin/fish 然后就可以直接使用了,就 ...
- Charlie's Change_完全背包&&路径记录
Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he ofte ...
- 8、SQL基础整理(约束)
约束 主键约束 防止在新增数据时出错,有约束性,起唯一标志的作用,在新增条目的时候防止不慎添加重复内容(不允许有null值) 1. 右键—设计—设置主键 2.在创建表格时设置 code int pr ...
- Unity3D内置资源包简介
Custom Package:倒入第三方的资源包,如果资源包存在中文路径,很容易导入入失败. Character Controller:角色控制相关脚本,第一第三人称的prefab; Glass Re ...
- 【转】高性能Javascript--脚本的无阻塞加载策略
原文转自:http://blog.jobbole.com/78191/ Javascript在浏览器中的性能,可以说是前端开发者所要面对的最重要的可用性问题. 在Yahoo的Yslow23条规则当中, ...
- [转Go-简洁的并发 ]
http://www.yankay.com/go-clear-concurreny/ Posted on 2012-11-28by yankay 多核处理器越来越普及.有没有一种简单的办法,能够让我们 ...
- matlab norm的使用
格式:n=norm(A,p)功能:norm函数可计算几种不同类型的矩阵范数,根据p的不同可得到不同的范数 以下是Matlab中help norm 的解释 NORM Matrix or vector n ...
- 《more effective C++》条款10 防止构造函数里的资源泄露
构造函数也可能发生内存泄露,考虑如下程序: class A { public: A(int *p) { if(p!=NULL) num=p; ); //do something } private: ...
- Hex Editor实现Notepad++16进制编辑功能
把HexEditor.dll文件复制到安装目录(如C:\Program Files\Notepad++\plugins),退出NotePad++重新打开即可!需要以十六进制显示时,点击菜单的:[插件] ...