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

Flutter单Activity(singleTask模式)下如何保持SDK Activity存活接收返回结果?

解决方案

你遇到的核心问题是:singleTask启动模式会清除同一任务栈中目标Activity之上的所有Activity——当SDK的Activity B在你的主Activity A的任务栈内启动A时,系统会将A移到栈顶并销毁B,导致B无法接收验证结果。以下是两种可行的解决思路:

方案一:新增透明临时Activity处理令牌激活请求

这是最稳妥的方案,无需修改主Activity的singleTask模式:

  1. 创建透明临时Activity
    新建一个无界面的透明Activity(比如命名为TokenActivationProxyActivity),将原本属于主Activity A的ACTIVATE_TOKEN intent-filter移到这个Activity上,同时设置其启动模式为默认的standard:

    <activity
        android:name=".TokenActivationProxyActivity"
        android:theme="@android:style/Theme.Translucent.NoTitleBar"
        android:launchMode="standard">
        <intent-filter>
            <action android:name="com.example.action.ACTIVATE_TOKEN"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>
    
  2. 代理请求到主Activity
    在TokenActivationProxyActivity的onCreate方法中,启动已存在的主Activity A(利用singleTask特性将其调到前台),同时保存当前的请求上下文:

    class TokenActivationProxyActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            // 启动主Activity并置于栈顶
            val intent = packageManager.getLaunchIntentForPackage(packageName)?.apply {
                flags = Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
            }
            startActivity(intent)
        }
    
        // 接收主Activity的验证结果并回传给SDK的Activity B
        fun sendResult(resultCode: Int, data: Intent?) {
            setResult(resultCode, data)
            finish()
        }
    }
    
  3. 主Activity返回结果到临时Activity
    在主Activity A完成令牌验证后,通过广播、EventBus或直接获取临时Activity实例(同任务栈内可实现),调用其sendResult方法传递结果,临时Activity会自动将结果回传给B并自行销毁。

方案二:调整Activity任务栈亲和性

如果不想新增Activity,可以通过任务栈隔离避免B被销毁:

  1. 修改主Activity的AndroidManifest配置
    给主Activity A设置独立的taskAffinity,确保和SDK的Activity B的任务亲和性不同:

    <activity
        android:name=".MainActivity"
        android:launchMode="singleTask"
        android:taskAffinity="com.example.myapp.task">
        <!-- 保留原有配置 -->
    </activity>
    
  2. 启动SDK Activity时添加新任务标记
    当主Activity A启动SDK的Activity B时,给Intent添加FLAG_ACTIVITY_NEW_TASK,让B在独立任务栈中启动:

    val intent = Intent("com.google.tapandpay.SDK_ACTIVITY")
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    startActivityForResult(intent, REQUEST_CODE_SDK)
    

此时B和A处于不同任务栈,当B启动A时,系统只会将A的任务栈带到前台,B所在的任务栈会留在后台且不会被销毁,A完成验证后可正常通过setResult将结果返回给B。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:30:36