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

Jetpack Compose中如何处理第三方SDK的onActivityResult回调

Paytm All-in-One SDK 适配 Activity Result API 方案

这类封装了完整页面启动逻辑、不对外暴露内部Intent的第三方SDK,不需要强行套用常规需要传入Intent的ActivityResultContract,自定义专用Contract即可完成适配,全程不需要修改SDK内部逻辑,也不需要反射获取SDK内部私有参数。


实现步骤

1. 自定义专用ActivityResultContract

核心是重写Contract的启动逻辑,直接调用SDK提供的startTransaction方法,不需要自己构造启动Intent:

const val REQUEST_CODE_PAYTM_TRANSACTION = 0x1001 // 仅需保证和当前页面其他请求码不冲突

class PaytmTransactionContract : ActivityResultContract<Unit, ActivityResult>() {
    override fun createIntent(context: Context, input: Unit): Intent {
        // 空实现即可,启动逻辑完全由Paytm SDK接管,不需要自行构造Intent
        return Intent()
    }

    override fun parseResult(resultCode: Int, intent: Intent?): ActivityResult {
        // 直接返回系统回调的原始结果,后续按Paytm官方文档规则解析即可
        return ActivityResult(resultCode, intent)
    }

    override fun launch(
        input: Unit,
        activity: Activity,
        options: Bundle?,
        callback: ActivityResultCallback<ActivityResult>
    ) {
        // 注册结果监听,对应Paytm使用的请求码
        val launcher = activity.activityResultRegistry.register(
            "paytm_transaction_launcher",
            this
        ) { result ->
            callback.onActivityResult(result.resultCode, result.data)
        }
        // 直接调用SDK官方提供的启动方法,传入当前Activity和约定好的请求码
        transactionManager.startTransaction(activity, REQUEST_CODE_PAYTM_TRANSACTION)
        launcher.launch(input, options)
    }
}

2. 注册并使用Launcher

Compose 场景(使用rememberLauncherForActivityResult)

// 在Composable作用域内注册启动器
val paytmTransactionLauncher = rememberLauncherForActivityResult(PaytmTransactionContract()) { result ->
    // 此处拿到的result和之前onActivityResult回调返回的参数完全一致
    // 直接复用你之前写好的Paytm结果解析逻辑即可
    when (result.resultCode) {
        Activity.RESULT_OK -> {
            // 解析result.data里的支付成功参数,处理业务逻辑
        }
        Activity.RESULT_CANCELED -> {
            // 处理用户取消支付的逻辑
        }
        // 其余Paytm自定义结果码按官方文档对应处理
    }
}

// 需要发起支付时直接调用launch即可,不需要传入任何额外参数
Button(onClick = { paytmTransactionLauncher.launch(Unit) }) {
    Text("发起支付")
}

传统Activity场景

// 在Activity onCreate中注册
val paytmLauncher = activityResultRegistry.register(
    "paytm_transaction",
    PaytmTransactionContract()
) { result ->
    // 结果处理逻辑和Compose场景完全一致
}

// 启动支付
paytmLauncher.launch(Unit)

注意事项

  • 不需要反编译SDK、反射获取内部Intent或请求码,所有调用均基于SDK公开API实现
  • 自定义的请求码只要不和当前页面其他Activity Result请求码重复即可
  • 结果解析逻辑完全兼容原有onActivityResult的写法,不需要做额外转换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:03:15