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
相关产品推荐
相关产品推荐

