You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Intent跳转时IntermediateActivity访问计数异常多增问题排查

问题排查方向
  • 首先看DragAndDrop类的onTouch方法逻辑:你对触摸事件的所有回调(ACTION_DOWN、ACTION_MOVE、ACTION_UP等)都会无差别触发check_success()校验,当圆形进入目标区域后,后续的连续触摸事件(比如拖动到位后的抬起动作)都会再次命中校验条件,导致多次调用startActivity启动IntermediateActivity。
  • 其次注意visitCount是静态变量,每次IntermediateActivity的onCreate执行都会自增,多次启动Activity自然会导致计数多次累加。
  • 还要排除Activity启动模式的影响,如果没有配置特殊启动模式,多次调用startActivity就会创建多个实例。
解决方案
  1. 限制跳转逻辑仅触发一次:在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();
    }
}
  1. 优化校验触发时机:不要在所有触摸事件都调用校验,仅在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;
}
  1. 可选优化:给IntermediateActivity配置合适的启动模式,或者在跳转后关闭前一个Activity,避免回退栈中存在多个重复实例。

内容的提问来源于stack exchange,提问作者Ravish Jha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 22:03:00