通过App Links跳转回原应用时CustomTab被关闭问题如何解决?
问题原因
两种跳转方式的逻辑差异加上你当前MainActivity的launchMode配置,共同导致了CustomTab被关闭:
- 你当前App1的MainActivity配置为
singleTask启动模式,该模式的核心特性是:如果Activity已经在任务栈中存在实例,再次启动该Activity时会将栈内该实例上方的所有Activity全部销毁,将自身抬到栈顶。 - CustomTab本质是托管在浏览器进程的Activity,从App1启动时默认会被加入到App1的任务栈中,位于MainActivity的上方。
- 包名跳转时,
getLaunchIntentForPackage返回的启动Intent会直接将App1已存在的整个任务栈拉到前台,不会触发栈内Activity的清理逻辑,因此CustomTab会被保留。 - App Links跳转时,启动的目标直接匹配到MainActivity,触发
singleTask的栈清理规则,直接销毁了位于MainActivity上方的CustomTab,因此出现CustomTab被关闭的问题。
可行解决方案
最稳妥的方案是拆分App Links接收逻辑,避免启动MainActivity触发栈清理:
- 新增一个专门处理App Links回调的透明Activity,无需布局,配置
noHistory属性避免留在栈中 - 将原本属于MainActivity的App Links intent-filter转移到这个新Activity上
- 新Activity接收到跳转请求后,处理完回调参数直接调用
finish()即可,此时App1的任务栈会被带到前台,CustomTab会完全保留不受影响
具体配置示例
App1 AndroidManifest新增Activity配置
<activity android:name=".AppLinkCallbackActivity" android:exported="true" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:noHistory="true"> <intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="https" android:host="some.secret.url" /> </intent-filter> </activity>
AppLinkCallbackActivity代码示例
public class AppLinkCallbackActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 此处处理App Links带回的参数、执行你的回调逻辑 // 处理完成直接finish finish(); } }
可选优化
如果不想新增Activity,可以将MainActivity的启动模式改为standard,同时在App2跳转的Intent中添加FLAG_ACTIVITY_REORDER_TO_FRONT | FLAG_ACTIVITY_SINGLE_TOP标志,不过该方案可能会产生MainActivity多实例的问题,优先级低于新增Activity的方案。
内容的提问来源于stack exchange,提问作者user969043
相关产品推荐
相关产品推荐

