美文网首页读书点点
Android解决连点打开多个页面,教你一招搞定

Android解决连点打开多个页面,教你一招搞定

作者: 萧清轩 | 来源:发表于2022-03-01 18:08 被阅读0次

    在开发项目时,离不开Activity之间的跳转,但时常会遇到暴力测试,因连点而导致的打开多个页面的情况,从而影响用户体验,并且甲方爸爸也揪着不放,随即我开始研究怎样避免打开多个页面,多方查询,有的通过修改AndroidManifest文件中的launchMode属性改为单例模式,有的通过重写dispatchTouchEvent,设置点击间隔,这两种方法对项目影响严重,比如第一种,无法创建复用页面,第二种呢,又影响双击事件,几番思考,我决定改善第二种方法,不再给他设置点击间隔,把条件换成布尔类型,然后就考虑什么时候修改布尔类型的值就可以了。
    定义布尔值

        private boolean switchPage;//防止暴力测试连点切换多个页面
    

    那就回到我们的需求,我们需要防止用户在跳转页面的时候暴力连点,什么时候跳转页面?自然是调用startActivity的时候,那么我们查看Activity源码,找到

        @Override
        public void startActivity(Intent intent) {
            this.startActivity(intent, null);
        }
    

    这里可以看出,它是个重载方法,实际它调用的是startActivity(Intent intent, Bundle options)

        @Override
        public void startActivity(Intent intent, @Nullable Bundle options) {
        }
    

    当然也可以继续往下追踪溯源,但到这里就足够了,我们重写这个方法,并且在重写方法里把定义的布尔值修改,如

        @Override
        public void startActivity(Intent intent, Bundle bundle) {
            switchPage = true;
            super.startActivity(intent, bundle);
        }
    

    然后就是通过判断布尔值来屏蔽多余的点击事件,我们都知道,touchEvent返回值为true就不在向下传递,也就间接的屏蔽了其他按钮的响应

        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            if (ev.getAction() == MotionEvent.ACTION_DOWN) {
                if (switchPage) {
                    return true;
                }
            }
            return super.dispatchTouchEvent(ev);
        }
    

    好了,到这里就解决了连点导致的打开多个页面的问题,那么我们只拦截了,没有放开啊?回来怎么办呢?贼简单,大家都知道,Activity回到页面会执行什么生命周期?onResume() 嘛,在这里我们再给修改回来不就可以喽!

        @Override
        protected void onResume() {
            switchPage = false;
            super.onResume();
        }
    

    好了,屏蔽和接触触摸事件的代码就搞定了,把这些代码搞到BaseActivity里,优化工作就完成了

    相关文章

      网友评论

        本文标题:Android解决连点打开多个页面,教你一招搞定

        本文链接:https://www.haomeiwen.com/subject/qbfjrrtx.html