由于接触android时间也不是很久,而且主要都是在做相当于后端的工作,对于前端ui的编码经验不足,导致有时候碰见一些问题一时半会找不到解决思路,很尴尬
最近刚好接手一个做ui的同事刚做一半的工作来协助做,其他功能逻辑等的开发都是挺顺利的,唯独碰见一个ui交互上的问题,硬是卡了我半天时间,一直苦苦无法解决,且始终想不通
问题:
A应用的OneActivity跳转到B应用的TwoActivity时候,如果在OneActivity的Button处双击或者多次点击打算进入TwoActivity,则会很大概率出现界面先进入了TwoActivity,然后立马又闪现到了OneActivity,分析log都没有异常崩溃等迹象。朋友们跟我说要在点击Button的时候添加防抖,我也是这么认为的添加防抖应该就好了,但是我为了当用户点击Button后能够快速的进入TwoActivity,我使用的是先执行startActivity后再挡掉后边的点击动作,结果一直苦苦不能解决,问题一直复现到,通过log查看分析,OneActivity始终先onPause然后又onResume了,我这个人就是那种不信邪的人,我想着应该是在OneActivity启动TwoActivity之后,由于界面仍然还在OneActivity,所以OneActivity继续接收到了点击事件,可能系统就会出现这个问题,我一直认为的是系统应该有问题,因为我们做的项目都是在客制化的系统上开发的,然后我就在OneActivity中点击Button后使用各种点击事件消耗机制,防止分发机制,结果都无法解决,感觉自己就是掉到坑里边了,出不来!!!
终于后来突然灵光一闪,卧艹!我怎么不知道先delay防抖再执行啊。。。,当我想到这个思路后,我就已经100%肯定这个问题一定能解决了!果不其然,测试一下后完全没有问题了,唉!!!!哭笑不得。。。
现在分享出来希望能帮助和我一样遇见这样的问题苦苦执着也想不通,浪费时间精力的同行们,让我们一起共勉,奋斗。。。
最后总结:
Android的跨进程启动另外一个应用界面时出现这样的问题可能应该是正常的(虽然我也没有系统的学习过安卓,尤其是UI的部分),这应该是Android的一个机制,它应该是判断了用户快速点击的时候,当用户最后的点击事件被哪个Avtivity所响应了,那么就会
自动切换回哪个Activity,所以最好的解决办法就是使用先delay一定的时间,再执行启动TwoActivity的操作,这样可以始终保持我们自己的启动TwoActivity动作是在用户的点击动作之后才操作的就可以了
private Runnable startTwoActivityRun = new Runnable() { @Override public void run() { //启动TwoActivity的逻辑 } }; /** * toTwoActivity */ public void toTwoActivity() { Log.i(TAG,"toTwoActivity()"); mHandler.removeCallbacks(startTwoActivityRun); mHandler.postDelayed(startTwoActivityRun,500); }