【Android程式碼片段之八】監聽Android螢幕是否鎖屏

來源:互聯網
上載者:User

標籤:

實現方法: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

【Android程式碼片段之八】監聽Android螢幕是否鎖屏

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.