今天碰到一个奇怪的类,整个类里面所有类的成员变量都是静态的,还是想不明白,这样写会不会有问题。代码本身是同事的(感谢)。
类本身没有特别的意义,是检测手机点亮屏幕前后发出的一系列动作,比如点亮的屏幕的时候开始计算时间,当超过一定时间,打开超时密码界面。
因为我们的应用本身有多个activity,每个activity打开的时候其实都是需要先通过这个类来检测屏幕点亮熄灭的动作,从而判断是否要弹出超时密码界面。所有成员函数和成员变量全部做成static的初衷是,希望任何activity打开它的时候,这些成员都是同一份,这样的好处是,后来的activity调用这个类会更新里面的成员函数,保证里面数据总是被更新,然后回退到上一个activity,这个类里面的成员依旧有效。
但是,如果想实现成员都是同一份的话,为什么不用单例模式呢?当前的形式有什么问题呢?这里需要好好思考一下,在这里记录一下,有结论后进一步更新
public class LockPatternObserver {
private static final ScreenObserver sScreenObserver = new ScreenObserver();
private static final TickWindow sPatternTickWindow = new TickWindow();
private static int sCount = 0;
public static void onCreate() {
// 打开首个页面时 监听屏幕状态
<span style="white-space:pre"> </span>if (sCount == 0) {
sScreenObserver.requestScreenStateUpdate(getContext(), sScreenStateListener);
}
sCount++;
}
public static void onDestroy() {
if (sCount > 0) {
// <= 0 的情况应该不会出现
sCount--;
// 如果所有页面都已关闭 取消监听屏幕状态
if (sCount == 0) {
sScreenObserver.stopScreenStateUpdate();
sTickWindow.stopTick();
}
}
}
public static void startTick() {
sTickWindow.startTick();
}
// 判断是否需要进入手势密码解锁
public static boolean checkPattern() {
if (sTickWindow.isExpired()) {
return true;
}
sTickWindow.updateTick();
return false;
}
// 解锁之后计时的窗口,用于计录当前界面进入锁屏状态需要的时间
private static class TickWindow {
private boolean mTicking = false;
private long mLastStartTickTime = 0;
public void startTick(){
mTicking = true;
updateTick();
}
public void stopTick(){
mTicking = false;
}
public void updateTick(){
mLastStartTickTime = System.currentTimeMillis();
}
public boolean isExpired(){
if (!mTicking) {
return true;
}
long current = System.currentTimeMillis();
long delta = current - mLastStartTickTime;
if(delta > PaymentUtils.FIVE_MINUTES){
mTicking = false;
return true;
}
return false;
}
}
private static final ScreenObserver.ScreenStateListener
sScreenStateListener = new ScreenObserver.ScreenStateListener() {
@Override
public void onScreenOn() {
}
@Override
public void onScreenOff() {
sTickWindow.stopTick();
}
};
}