转载请注明出处,原文网址:http://blog.csdn.net/m_changgong/article/details/7608911作者:张燕广

实现方法: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;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);mScreenObserver = new ScreenObserver(this);mScreenObserver.requestScreenStateUpdate(new ScreenStateListener() {@Overridepublic void onScreenOn() {doSomethingOnScreenOn();}@Overridepublic void onScreenOff() {doSomethingOnScreenOff();}});}private void doSomethingOnScreenOn() {Log.i(TAG, "Screen is on");}private void doSomethingOnScreenOff() {Log.i(TAG, "Screen is off");}@Overrideprotected void onDestroy() {super.onDestroy();//停止监听screen状态mScreenObserver.stopScreenStateUpdate();}}

源码:点击下载源码

更多相关文章

  1. 源码分析Android启动流程
  2. android6.0源码分析之Runtime的初始化
  3. Android Eclipse 源码工程 调试
  4. Android 屏幕切换时不销毁Activity
  5. Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面
  6. Android唤醒、解锁屏幕代码实例
  7. 使用代理下载android系统源码和SDK

随机推荐

  1. 线程池你真不来了解一下吗?
  2. 多线程之死锁就是这么简单
  3. VSCode跳转到定义内部实现_VSCode插件开
  4. ES2018
  5. TypescriptServerPlugin_VSCode插件开发
  6. Taro
  7. Android(安卓)源码导入Eclipse技巧(Ubuntu
  8. Android(安卓)调用摄像头功能【拍照与视
  9. 选中菜单android中的显示跳转和隐式跳转
  10. SimpleCropView 裁剪图片