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

时间:2023-03-09 08:49:45
【Android代码片段之八】监听Android屏幕是否锁屏

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

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

具体实现,见代码:

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

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

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

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