zoukankan      html  css  js  c++  java
  • 【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
  • 相关阅读:
    HDU 1890 Robotic Sort (splay tree)
    POJ 3468 A Simple Problem with Integers (splay tree入门)
    1588: [HNOI2002]营业额统计 (splay tree)
    HDU 4597 Play Game (DP,记忆化搜索)
    HDU 4499 Cannon (搜索)
    HDU 4497 GCD and LCM (合数分解)
    升级到 Android Studio 3.0 + Gradle 4.1 遇到的一些坑及解决方案
    关于The specified Android SDK Build Tools version (26.0.2) is ignored, as it is below the minimum...
    Android Studio启动时出现unable to access android sdk add-on list
    unable to access android sdk add-on list(转)
  • 原文地址:https://www.cnblogs.com/cmblogs/p/4813816.html
Copyright © 2011-2022 走看看