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

如何在后台计时器到期时强制取消Google支付表单?

解决方案:计时器到期强制关闭Google Pay支付表单

这个需求很典型,针对时效性强的支付场景完全合理,我们可以借助Android的Activity生命周期和Google Pay的集成逻辑来实现,具体步骤如下:

1. 先定义计时器与状态标志

在你的Activity类里,先声明计时器和一个布尔标志位,用来区分是用户主动操作还是计时器到期触发的支付表单关闭:

private CountDownTimer paymentTimer;
private boolean isTimerExpired = false;
private static final int LOAD_PAYMENT_DATA_REQUEST_CODE = 1001; // 对应你的请求码

2. 启动计时器并发起Google Pay请求

在调用AutoResolveHelper.resolveTask()发起支付前,启动后台计时器。当计时器到期时,切换标志位并调用finishActivity()关闭支付表单——这个方法能精准终止我们通过请求码启动的Google Pay页面:

// 示例:设置5分钟(300000毫秒)的支付超时计时器
paymentTimer = new CountDownTimer(300000, 1000) {
    @Override
    public void onTick(long millisUntilFinished) {
        // 可选:在这里更新UI显示剩余支付时间
    }

    @Override
    public void onFinish() {
        isTimerExpired = true;
        // 必须在主线程调用Activity相关方法,避免线程异常
        runOnUiThread(() -> finishActivity(LOAD_PAYMENT_DATA_REQUEST_CODE));
    }
}.start();

// 发起Google Pay支付请求
AutoResolveHelper.resolveTask(futurePayTask, this, LOAD_PAYMENT_DATA_REQUEST_CODE);

3. 在onActivityResult中区分场景处理回调

不管是用户主动取消/完成支付,还是计时器到期关闭表单,onActivityResult都会被触发。这里用isTimerExpired标志位区分场景,执行对应的业务逻辑:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == LOAD_PAYMENT_DATA_REQUEST_CODE) {
        if (isTimerExpired) {
            // 计时器到期触发的关闭,提示用户支付超时并处理后续逻辑
            Toast.makeText(this, "支付超时,请重新发起支付", Toast.LENGTH_LONG).show();
        } else {
            // 正常用户操作场景,按原有逻辑处理
            switch (resultCode) {
                case Activity.RESULT_OK:
                    PaymentData paymentData = PaymentData.getFromIntent(data);
                    // 处理支付成功逻辑
                    break;
                case Activity.RESULT_CANCELED:
                    // 处理用户主动取消逻辑
                    break;
                case AutoResolveHelper.RESULT_ERROR:
                    Status status = AutoResolveHelper.getStatusFromIntent(data);
                    // 处理支付错误逻辑
                    break;
            }
        }
        // 重置标志位并取消计时器,避免内存泄漏
        isTimerExpired = false;
        if (paymentTimer != null) {
            paymentTimer.cancel();
        }
    }
}

4. 额外的内存泄漏防护

在Activity销毁时务必取消计时器,避免内存泄漏:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (paymentTimer != null) {
        paymentTimer.cancel();
    }
}

这个方案的核心是利用finishActivity()精准终止指定请求码的Activity,既不会影响其他页面,又能满足你强制关闭支付表单的需求,建议在目标API版本和主流设备上做兼容性测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:48:36