Android Intent跳转时IntermediateActivity访问计数异常多增问题排查
问题排查方向
- 首先看
DragAndDrop类的onTouch方法逻辑:你对触摸事件的所有回调(ACTION_DOWN、ACTION_MOVE、ACTION_UP等)都会无差别触发check_success()校验,当圆形进入目标区域后,后续的连续触摸事件(比如拖动到位后的抬起动作)都会再次命中校验条件,导致多次调用startActivity启动IntermediateActivity。 - 其次注意
visitCount是静态变量,每次IntermediateActivity的onCreate执行都会自增,多次启动Activity自然会导致计数多次累加。 - 还要排除Activity启动模式的影响,如果没有配置特殊启动模式,多次调用startActivity就会创建多个实例。
解决方案
- 限制跳转逻辑仅触发一次:在DragAndDrop中增加一个跳转标记位,避免重复触发跳转:
// 增加成员变量标记是否已经触发跳转 private boolean hasNavigated = false; public void check_success(){ // 已经跳转就直接返回 if (hasNavigated) return; float centreX = img.getX() + img.getWidth() / 2; float centreY = img.getY() + img.getHeight() / 2; float centreX_outline = img_outline.getX() + img_outline.getWidth() / 2; float centreY_outline = img_outline.getY() + img_outline.getHeight() / 2; if((centreX >= centreX_outline-75) &&(centreX <= centreX_outline+75) && (centreY >= centreY_outline-75) &&(centreY <= centreY_outline+75)){ // 标记为已跳转 hasNavigated = true; // 原有振动逻辑不变 Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { v.vibrate(VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE)); } else { v.vibrate(500); } Intent i = new Intent(DragAndDrop.this, IntermediateActivity.class); startActivity(i); // 可选:调用finish()关闭当前DragAndDropActivity,避免回退栈残留 finish(); } }
- 优化校验触发时机:不要在所有触摸事件都调用校验,仅在
ACTION_UP(手指抬起)的时候调用check_success(),减少无效校验也能避免连续事件触发多次跳转:
public boolean onTouch(View view, MotionEvent event) { final int X = (int) event.getRawX(); final int Y = (int) event.getRawY(); switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams(); _xDelta = X - lParams.leftMargin; _yDelta = Y - lParams.topMargin; break; case MotionEvent.ACTION_UP: // 仅手指抬起时校验是否成功 check_success(); break; case MotionEvent.ACTION_MOVE: // 原有拖动逻辑不变 ViewGroup.MarginLayoutParams marginParams = new ViewGroup.MarginLayoutParams(img.getLayoutParams()); int left = (int) event.getRawX() - (view.getWidth() / 2); int top = (int) event.getRawY() - (view.getHeight()); marginParams.setMargins(left, top, 0, 0); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(marginParams); img.setLayoutParams(layoutParams); break; } rootLayout.invalidate(); return true; }
- 可选优化:给IntermediateActivity配置合适的启动模式,或者在跳转后关闭前一个Activity,避免回退栈中存在多个重复实例。
内容的提问来源于stack exchange,提问作者Ravish Jha
相关产品推荐
相关产品推荐

