【Android代码片段之八】监听Android屏幕是否锁屏

实现方法:1)通过BroadcastReceiver接收广播Intent.ACTION_SCREEN_ON和Intent.ACTION_SCREEN_OFF可以判断屏幕状态是否锁屏,但是只有屏幕状态发生改变时才会发出广播;

2)如果要在屏幕状态发生改变之前就想获取屏幕状态,可以通过反射机制调用PowerManager的isScreenOn方法 。

具体实现,见代码:

实现Screen状态监听的类ScreenObserver,实现如下:

 

[java] view plaincopy
 
  1. package com.isoft.screen;  
  2.   
  3. import java.lang.reflect.Method;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.BroadcastReceiver;  
  7. import android.content.Context;  
  8. import android.content.Intent;  
  9. import android.content.IntentFilter;  
  10. import android.os.PowerManager;  
  11. import android.util.Log;  
  12.   
  13. /** 
  14.  *  
  15.  * @author zhangyg 
  16.  * 
  17.  */  
  18. public class ScreenObserver{  
  19.     private static String TAG = "ScreenObserver";  
  20.     private Context mContext;  
  21.     private ScreenBroadcastReceiver mScreenReceiver;  
  22.     private ScreenStateListener mScreenStateListener;  
  23.     private static Method mReflectScreenState;  
  24.       
  25.     public ScreenObserver(Context context){  
  26.         mContext = context;  
  27.         mScreenReceiver = new ScreenBroadcastReceiver();  
  28.         try {  
  29.             mReflectScreenState = PowerManager.class.getMethod("isScreenOn",  
  30.                     new Class[] {});  
  31.         } catch (NoSuchMethodException nsme) {  
  32.             Log.d(TAG, "API < 7," + nsme);  
  33.         }  
  34.     }  
  35.       
  36.     /** 
  37.      * screen状态广播接收者 
  38.      * @author zhangyg 
  39.      * 
  40.      */  
  41.     private class ScreenBroadcastReceiver extends BroadcastReceiver{  
  42.         private String action = null;  
  43.         @Override  
  44.         public void onReceive(Context context, Intent intent) {  
  45.             action = intent.getAction();  
  46.             if(Intent.ACTION_SCREEN_ON.equals(action)){  
  47.                 mScreenStateListener.onScreenOn();  
  48.             }else if(Intent.ACTION_SCREEN_OFF.equals(action)){  
  49.                 mScreenStateListener.onScreenOff();  
  50.             }  
  51.         }  
  52.     }  
  53.       
  54.       
  55.     /** 
  56.      * 请求screen状态更新 
  57.      * @param listener 
  58.      */  
  59.     public void requestScreenStateUpdate(ScreenStateListener listener) {  
  60.         mScreenStateListener = listener;  
  61.         startScreenBroadcastReceiver();  
  62.           
  63.         firstGetScreenState();  
  64.     }  
  65.       
  66.     /** 
  67.      * 第一次请求screen状态 
  68.      */  
  69.     private void firstGetScreenState(){  
  70.         PowerManager manager = (PowerManager) mContext  
  71.                 .getSystemService(Activity.POWER_SERVICE);  
  72.         if (isScreenOn(manager)) {  
  73.             if (mScreenStateListener != null) {  
  74.                 mScreenStateListener.onScreenOn();  
  75.             }  
  76.         } else {  
  77.             if (mScreenStateListener != null) {  
  78.                 mScreenStateListener.onScreenOff();  
  79.             }  
  80.         }  
  81.     }  
  82.       
  83.     /** 
  84.      * 停止screen状态更新 
  85.      */  
  86.     public void stopScreenStateUpdate(){  
  87.         mContext.unregisterReceiver(mScreenReceiver);  
  88.     }  
  89.       
  90.     /** 
  91.      * 启动screen状态广播接收器 
  92.      */  
  93.     private void startScreenBroadcastReceiver(){  
  94.         IntentFilter filter = new IntentFilter();  
  95.         filter.addAction(Intent.ACTION_SCREEN_ON);  
  96.         filter.addAction(Intent.ACTION_SCREEN_OFF);  
  97.         mContext.registerReceiver(mScreenReceiver, filter);  
  98.     }  
  99.       
  100.     /** 
  101.      * screen是否打开状态 
  102.      * @param pm 
  103.      * @return 
  104.      */  
  105.     private static boolean isScreenOn(PowerManager pm) {  
  106.         boolean screenState;  
  107.         try {  
  108.             screenState = (Boolean) mReflectScreenState.invoke(pm);  
  109.         } catch (Exception e) {  
  110.             screenState = false;  
  111.         }  
  112.         return screenState;  
  113.     }  
  114.       
  115.     public interface ScreenStateListener {  
  116.         public void onScreenOn();  
  117.         public void onScreenOff();  
  118.     }  
  119. }  


测试ScreenObserver功能的示例类ScreenObserverActivity,实现如下:

 

 

[java] view plaincopy
 
    1. package com.isoft.screen;  
    2.   
    3. import android.app.Activity;  
    4. import android.os.Bundle;  
    5. import android.util.Log;  
    6.   
    7. import com.isoft.screen.ScreenObserver.ScreenStateListener;  
    8.   
    9. public class ScreenObserverActivity extends Activity {  
    10.     private String TAG = "ScreenObserverActivity";  
    11.     private ScreenObserver mScreenObserver;  
    12.       
    13.     @Override  
    14.     public void onCreate(Bundle savedInstanceState) {  
    15.         super.onCreate(savedInstanceState);  
    16.         setContentView(R.layout.main);  
    17.   
    18.         mScreenObserver = new ScreenObserver(this);  
    19.         mScreenObserver.requestScreenStateUpdate(new ScreenStateListener() {  
    20.             @Override  
    21.             public void onScreenOn() {  
    22.                 doSomethingOnScreenOn();  
    23.             }  
    24.   
    25.             @Override  
    26.             public void onScreenOff() {  
    27.                 doSomethingOnScreenOff();  
    28.             }  
    29.         });  
    30.     }  
    31.   
    32.     private void doSomethingOnScreenOn() {  
    33.         Log.i(TAG, "Screen is on");  
    34.     }  
    35.   
    36.     private void doSomethingOnScreenOff() {  
    37.         Log.i(TAG, "Screen is off");  
    38.     }  
    39.       
    40.     @Override  
    41.     protected void onDestroy() {  
    42.         super.onDestroy();  
    43.         //停止监听screen状态  
    44.         mScreenObserver.stopScreenStateUpdate();  
    45.     }  
    46. }  
    47. http://blog.csdn.net/m_changgong/article/details/7608911

posted on 2015-09-16 17:02  %幻#影%  阅读(519)  评论(0编辑  收藏  举报

导航