singleTask模式下调用moveTaskToBack后VideoActivity触发onDestroy问题求助
核心原因
你遇到的问题是singleTask启动模式的特性导致的:
当两个Activity(MainActivity和VideoActivity)使用默认相同的taskAffinity(属于同一个任务栈)且均为singleTask模式时,在VideoActivity中启动MainActivity的操作会触发系统栈清理规则:系统会定位到MainActivity所在的任务栈,将位于MainActivity之上的所有Activity(即当前的VideoActivity)全部出栈销毁,同时把MainActivity带到栈顶,因此VideoActivity的onDestroy会被调用。
正确操作方案
根据你“将VideoActivity隐藏至后台并保持存活、可随时重新显示”的需求,可选择以下方案:
方案1:仅调用moveTaskToBack(true),不启动MainActivity
直接在VideoActivity中调用moveTaskToBack(true),包含MainActivity和VideoActivity的整个任务栈会被移至后台,VideoActivity不会被销毁。后续用户点击应用图标时,会直接回到栈顶的VideoActivity;如果需要从VideoActivity切换回MainActivity且不销毁Video,可在启动MainActivity时添加FLAG_ACTIVITY_SINGLE_TOP标记(避免重建MainActivity),此时MainActivity会位于Video之上,按返回键即可回到VideoActivity。
方案2:给VideoActivity设置独立任务栈
在AndroidManifest.xml中为VideoActivity配置独立的taskAffinity,让它运行在单独的任务栈中:
<activity android:name=".VideoActivity" android:launchMode="singleTask" android:taskAffinity="com.yourpackage.video.task" />
操作流程:
- 在VideoActivity中调用
moveTaskToBack(true),将Video所在的独立任务栈移至后台; - 启动MainActivity(它会运行在默认任务栈中);
- 后续需要显示VideoActivity时,直接启动它即可——由于是
singleTask模式,系统会将后台的Video任务栈带到前台,VideoActivity保持之前的状态。
方案3:调整MainActivity的启动模式
如果不需要MainActivity保持singleTask模式,可将其改为singleTop或默认的standard,这样在VideoActivity中启动MainActivity时,不会触发栈清理规则,VideoActivity会保留在栈中,只是被新启动的MainActivity覆盖,后续按返回键仍能回到VideoActivity。
内容的提问来源于stack exchange,提问作者Godrick

