Android返回时跳过指定Activity的DeepLink场景解决方案咨询
绝对可以通过Android的Back Stack和Task相关机制搞定这个问题!结合你的singleTop限制、不能调用finish()关闭MainActivity的要求,以及最低API16的版本限制,我给你两个针对性的方案,其中第一个最贴合你的场景:
方案一:重写ThreeActivity的返回逻辑,直接调起TwoActivity
这个方案简单直接,完全不影响现有栈结构,也不会触碰MainActivity的状态:
在ThreeActivity中重写onBackPressed()方法,主动启动TwoActivity并将其调到栈顶,同时关闭当前的ThreeActivity即可。
代码示例:
@Override public void onBackPressed() { Intent intent = new Intent(this, TwoActivity.class); // 把栈中已存在的TwoActivity实例调到栈顶,不会新建 intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(intent); // 关闭当前ThreeActivity,不影响其他栈元素 finish(); }
为什么这个方案可行?
FLAG_ACTIVITY_REORDER_TO_FRONT从API1就支持,完美适配你的最低API16要求;- 它只会将已存在的TwoActivity实例移到栈顶,不会新建,也不会finish任何其他Activity(包括那个不能动的MainActivity);
- 按下返回键后,ThreeActivity被关闭,TwoActivity直接显示,完全符合你的需求。
方案二:优化回退栈初始结构(可选)
如果你想从根源上简化回退栈结构,避免中间多生成一个MainActivity实例,可以先修改TwoActivity启动MainActivity的逻辑:
当TwoActivity通过DeepLink启动MainActivity时,给Intent添加FLAG_ACTIVITY_REORDER_TO_FRONT,这样会复用栈中已有的MainActivity实例(而不是新建),此时回退栈结构会变为[Main, One, Two](Main回到栈顶)。
之后在MainActivity启动ThreeActivity时,无需额外特殊配置,此时回退栈为[Main, One, Two, Three]。若要实现Three返回直接到Two,依然可以复用方案一的返回逻辑,或者在启动Three时添加FLAG_ACTIVITY_CLEAR_TOP(但该flag会清除Two之上的所有实例,包括Main,不符合你不能finish Main的要求,所以更推荐继续用方案一的返回逻辑)。
这个方案适合希望栈结构更简洁的场景,但需要改动TwoActivity的启动逻辑,相比方案一稍显繁琐。
内容的提问来源于stack exchange,提问作者Jack

