在开发项目时,离不开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里,优化工作就完成了
网友评论