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

未启动App时,如何通过Deep Link打开含HomeActivity返回栈的透明Activity?

规范实现方案

一、Manifest 配置

  1. HomeActivity:保持它作为应用入口的配置(带有ACTION_MAIN和CATEGORY_LAUNCHER的intent-filter),launchMode使用默认的standard即可,若需避免重复实例可设置为singleTop。

  2. 透明BillingActivity:

    • 配置Deep Link的intent-filter,匹配你的自定义scheme/host;
    • 设置android:launchMode="standard";
    • 应用透明主题(比如自定义Theme.Transparent);
    • 确保android:taskAffinity与应用包名一致(默认即为包名,无需额外配置,避免创建独立任务栈)。

Manifest代码示例:

<activity
    android:name=".HomeActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name=".BillingActivity"
    android:exported="true"
    android:launchMode="standard"
    android:theme="@style/Theme.Transparent">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- 替换为你的Deep Link规则 -->
        <data
            android:host="purchase"
            android:scheme="yourapp" />
    </intent-filter>
</activity>

二、代码逻辑处理

在BillingActivity的onCreate方法中,判断是否是从新任务启动(即应用此前未运行),如果是,先通过TaskStackBuilder构建包含HomeActivity的返回栈,再执行购买逻辑。

核心代码:

class BillingActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 判断是否为新任务启动(应用未运行时唤起Deep Link)
        val isNewTask = intent.flags and Intent.FLAG_ACTIVITY_NEW_TASK != 0
        val isFromHistory = intent.flags and Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY != 0

        if (isNewTask && !isFromHistory) {
            // 构建返回栈:HomeActivity → BillingActivity
            val stackBuilder = TaskStackBuilder.create(this)
            stackBuilder.addNextIntent(Intent(this, HomeActivity::class.java))
            stackBuilder.addNextIntent(intent)
            // 启动栈并结束当前实例,避免重复
            stackBuilder.startActivities()
            finish()
            return
        }

        // 初始化Play Billing并唤起购买弹窗
        initBillingFlow()
    }

    private fun initBillingFlow() {
        // 这里编写Play Billing Library的交互逻辑
        // 示例:初始化BillingClient、发起购买请求等
        // val billingClient = BillingClient.newBuilder(this).setListener(purchaseUpdateListener).build()
        // billingClient.startConnection(object : BillingClientStateListener { ... })
    }
}

关键细节:

  • 新任务判断:FLAG_ACTIVITY_NEW_TASK标记说明当前Activity是新任务的根节点,对应应用未启动的场景;FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY用于排除从系统历史记录唤起的情况;
  • TaskStackBuilder作用:自动维护正确的返回栈结构,确保用户按返回键时,先回到HomeActivity,再退出应用;
  • 避免重复实例:通过stackBuilder启动新的栈后,finish当前的BillingActivity实例,防止栈中出现重复的Activity。

三、场景验证

  • App已启动:Deep Link直接将BillingActivity添加到当前任务栈顶,返回键回到之前的页面;
  • App未启动:启动后返回栈为HomeActivity → BillingActivity,显示购买弹窗,返回先到HomeActivity,再按返回键退出应用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 08:05:28