android app中如何获取电源锁保持屏幕常亮

2019-07-13 22:17发布

android 中电源锁有 wakeLock 和  FLAG_KEEP_SCREEN_ON 这两种。如果你想在你的应用中一进来就使屏幕保持常亮,并且不随系统亮度发生变化(一般应用都是你进去以后不操作它的话,系统自动灭屏时间到就自动灭屏进锁机界面了)。方式一,使用 FLAG_KEEP_SCREEN_ON:在进入 app 的时候添加该 flag,退出 app 的时候清除该 flaggetWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); //建议加在 onCreate 或者 onResume 函数中getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); //建议加在 onDestroy 或者 onPause 函数中
方式二, 使用PowerManager.WakeLock使用这种方式,最好需要将 PowerManager.WakeLock 包装一下[java] view plain copy
  1. privatevoid acquireWakeLock() {  
  2.      if (wakeLock ==null) {  
  3.             Log.d("Acquiring wake lock");  
  4.             PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);  
  5.             wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, this.getClass().getCanonicalName());  
  6.             wakeLock.acquire();  
  7.         }  
  8.       
  9. }  
  10.   
  11.   
  12. privatevoid releaseWakeLock() {  
  13.     if (wakeLock !=null&& wakeLock.isHeld()) {  
  14.         Log.d("Release wake lock");  
  15.         wakeLock.release();  
  16.         wakeLock =null;  
  17.     }  
  18.   
  19. }  


建议 acquireWakeLock 放在 onCreate 或 onResume 函数中调用,而 releaseWakeLock 则放在 onDestroy 或者 onPause 函数中调用。还有一种情况,假如应用程序想在进入以后两分钟内无操作自动走系统灭屏流程,那么该如何设置呢?有了上面的基础就很容易办了。在 onResume 或者 应用跑起来了以后执行 keepScreenOnAwhile() 函数,利用 Handler 的延时机制来处理清除消息的事件[java] view plain copy
  1. public void keepScreenOnAwhile() {  
  2.     if (LOG) {  
  3.         Log.v(TAG, "keepScreenOnAwhile()");  
  4.     }  
  5.     mMainHandler.removeMessages(MSG_CLEAR_SCREEN_DELAY);  
  6.     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);  
  7.     mMainHandler.sendEmptyMessageDelayed(MSG_CLEAR_SCREEN_DELAY, DELAY_MSG_SCREEN_SWITCH);  
  8. }  
在 Handler 的 case 中添加 MSG_CLEAR_SCREEN_DELAY 对应的处理,即清除消息标志 FLAG_KEEP_SCREEN_ON 
[java] view plain copy
  1.   private Handler mMainHandler = new Handler() {  
  2.       @Override  
  3.       public void handleMessage(Message msg) {  
  4.           switch(msg.what) {  
  5.           case MSG_CLEAR_SCREEN_DELAY:  
  6.               getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);  
  7.               break;  
  8.           case FULLCHANGE:   
  9. setCameraState(STATE_IDLE);  
  10. break;            
  11.    default:  
  12. break;  
  13.    }  
  14.       };  
  15.   };  

致此,就可以比较完整的实现上述需求了!