一个全部是staitic 的类

今天碰到一个奇怪的类,整个类里面所有类的成员变量都是静态的,还是想不明白,这样写会不会有问题。代码本身是同事的(感谢)。

类本身没有特别的意义,是检测手机点亮屏幕前后发出的一系列动作,比如点亮的屏幕的时候开始计算时间,当超过一定时间,打开超时密码界面。

因为我们的应用本身有多个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();
        }
    };
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值