未启动App时,如何通过Deep Link打开含HomeActivity返回栈的透明Activity?
规范实现方案
一、Manifest 配置
HomeActivity:保持它作为应用入口的配置(带有
ACTION_MAIN和CATEGORY_LAUNCHER的intent-filter),launchMode使用默认的standard即可,若需避免重复实例可设置为singleTop。透明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
相关产品推荐
相关产品推荐

