Android 工作中遇到的问题及解决方案之屏无操作过了一段时间进入息屏状态
事情的起因是因为们做了一个功能,在Activity初始化的时候设置了一个FlagsWindowManager的flages大全,长亮的flag:FLAG_KEEP_SCREEN_ON。有用户说,忘记看手机导致了手机常亮没有电了。因此我们就需要一个功能无操作多少之后就关闭屏幕,进入息屏状态。
然后我就去调研了很多方案,有一种需要调用系统API的方案,直接进入锁屏状态,但是需要系统级别的权限,因此不考虑。就换了一种自己记录操作时间时间的方案,然后利用 PowerManager.WakeLock这个类来控制屏幕的亮度。
核心代码
private void initWakeLock() {
//默认时间
long setOffTime = 30000;
if (getWindow() != null) {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
mCountTimeHandler.removeMessages(1);
if (setOffTime < 0) {
//设置屏幕常亮
if (getWindow() != null) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
} else {
long defSystemOffTIme = getScreenOffTime();
//系统的默认时间超过了我们的设置的屏保时间,就不用操作了,只用系统的就行
//系统的默认时间没有超过我们的设置的屏保时间,就要设置
if (defSystemOffTIme < setOffTime) {
//设置屏幕常亮
if (getWindow() != null) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
mWakeLock.acquire();
wakeLockTime = setOffTime - defSystemOffTIme + 1000;
mCountTimeHandler.sendEmptyMessage(1);
}
}
}
/**
* [所有的操作都要重置时间,因此需要手动来调用这个方法]
* @return {[type]} [description]
*/
private void resetWakeLock() {
long setOffTime = ReadSettingManager.getInstance().getWakeLockTime().getTime();
if (setOffTime > 0) {
long defSystemOffTIme = getScreenOffTime();
if (defSystemOffTIme < setOffTime) {
wakeLockTime = setOffTime - defSystemOffTIme + 1000;
}
}
}
/**
* 当你更换模式或者退出的时候,需要清除
*/
private void clearWakeLock() {
try {
if (getWindow() != null) {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
if (mWakeLock.isHeld()) {
mWakeLock.release();
}
mCountTimeHandler.removeMessages(1);
} catch (Exception e) {
e.printStackTrace();
}
}
static class CountTimeHandler extends Handler {
WeakReference<Activity> weakReference;
public CountTimeHandler(Activity activity) {
weakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
if (weakReference.get() != null) {
Activity activity = (Activity) weakReference.get();
if (activity.wakeLockTime > 0) {
activity.wakeLockTime = activity.wakeLockTime - 1000;
this.sendEmptyMessageDelayed(1, 1000);
} else {
activity.clearWakeLock();
}
}
}
}
/**
* 获得休眠时间 毫秒
*/
private int getScreenOffTime() {
int screenOffTime = 0;
try {
screenOffTime = Settings.System.getInt(getContentResolver(),
Settings.System.SCREEN_OFF_TIMEOUT);
} catch (Exception localException) {
}
return screenOffTime;
}
方案就是设置一个屏保时间,然后和系统的默认的屏保时间对比,取大值,到了时间就释放掉wakeLock,然后用手机的自己的息屏时间。