如何在后台计时器到期时强制取消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
相关产品推荐
相关产品推荐

