安卓Deep Link跳转生成多实例,设置singleTask启动模式仍未解决
多实例问题排查与解决方案
- 首先你的第一个疑问:通过
tools:replace设置配置优先级的方案是可行的,仅适用于主模块的launchMode配置被第三方依赖库的清单配置覆盖的场景。添加配置后会强制清单合并时优先使用当前主模块的配置,覆盖所有依赖库中的同名属性配置,示例如下:
<activity android:name=".你要跳转的目标Activity全类名" android:launchMode="singleTask" tools:replace="android:launchMode"> <!-- 原有Deep Link对应的intent-filter配置 --> </activity>
- 接下来验证你推测的新旧版本多实例问题:直接在系统设置的应用列表中检查是否存在两个包名相近/相同的同应用实例,测试场景下如果应用签名不一致、或者修改过
applicationId后缀,会导致同一设备安装多个应用实例,Deep Link跳转时如果用户先后选择了不同实例就会出现你描述的问题,这种场景不需要修改代码,直接卸载多余的测试版本应用即可恢复正常。 - 额外排查修复项:
- 检查外部调用Deep Link时的Intent是否添加了
FLAG_ACTIVITY_NEW_TASK标识,部分Android版本下外部调用强制加该标识会绕过singleTask逻辑创建新实例,你可以在目标Activity的onCreate方法中添加校验逻辑,检测到重复实例时直接销毁,仅保留合法实例:
- 检查外部调用Deep Link时的Intent是否添加了
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 非任务栈根节点说明是重复启动的实例,直接销毁 if (!isTaskRoot()) { finish(); return; } // 原有业务逻辑 }
- 检查目标Activity是否配置了独立的
android:process属性,不同进程下的Activity不属于同一个任务栈,singleTask配置不会生效,这种场景需要调整进程配置,保证目标Activity和应用主进程一致。 - 如果你需要仅保留新跳转生成的实例、销毁旧实例,不需要通过
tools:replace实现,可以将launchMode调整为singleTop,同时在onNewIntent方法中处理跳转参数后主动销毁旧实例即可。
内容的提问来源于stack exchange,提问作者Mehrdad Dolatkhah
相关产品推荐
相关产品推荐

