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

在开发项目时,离不开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) {
    }

startActivity(Intent intent,@Nullable Bundle options)继续深度追踪,最终调用的是

public void startActivityForResult(@SuppressLint("UnknownNullness") Intent intent,
            int requestCode, @Nullable Bundle options) 

到这里就足够了,我们重写这个方法,并且在重写方法里把定义的布尔值修改,如

    @Override
    public void startActivityForResult(Intent intent, int requestCode,Bundle options) {
        switchActivity = true;
        super.startActivityForResult(intent, requestCode,options);
    }

然后就是通过判断布尔值来屏蔽多余的点击事件,我们都知道,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解决连点打开多个页面,教你一招搞定)