【问题标题】:prevent task manager from recreating last displayed activity in a task防止任务管理器重新创建任务中最后显示的活动
【发布时间】:2025-12-06 21:10:01
【问题描述】:

场景是:

启动应用程序,启动活动 A,导航到 B,然后按主页按钮到 C。 C被破坏。调出任务管理器,按我的应用程序图标。正在重新创建活动 C。我怎样才能让这种行为停止?我想回到活动 A。

我最接近此的方法是使用 Intent.FLAG_ACTIVITY_NO_HISTORY 启动活动 B、C。但是这个标志的问题在于它会阻止活动 B、C 在应用程序的整个生命周期中被重新创建(一旦任务管理器将用户引导到 A,它们应该是可创建的)。

编辑:如果我改用这种方法,则观察到与 Intent.FLAG_ACTIVITY_NO_HISTORY 情况相同的行为:

class C extends Activity
{
...
    @Override
    protected void onDestroy() 
    {
        // last resort
        finish();
        super.onDestroy();      
                //finish();
    }
}

一旦它的 onDestroy() 被调用一次,我就无法导航回活动 C :(

谢谢

【问题讨论】:

    标签: android android-intent flags activity-lifecycle


    【解决方案1】:

    在一个周末的人机大战之后,这就是我所经历的:

    noHistory ="true" 活动属性阻止它们从活动堆栈中位于它们下方的另一个活动启动 (startActivity())。事情是整个活动导航逻辑都通过一个将这个标志添加到意图的方法传递:

    context.startActivity(intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
    

    Android 无法“重新排序”“noHistory”活动,我认为这是一个错误。由于 noHistory 活动已经完成(),它应该召唤一个新的实例......有效的是在活动 A 上使用 FLAG_ACTIVITY_CLEAR_TOP(参见 OP)。这样,B 和 C 在所有场景中都得到了正确的实例化。 然而,这还不够,我最终完成了所有的活动,因为我一方面因为 OOM 错误而离开它们,另一方面是生命周期/应用程序逻辑的复杂性。

    【讨论】:

      【解决方案2】:

      编辑您的 Manifest.xml 文件并在您不想重新创建的活动中指定:

      android:launchMode="singleTask"
      

      或者根据您的要求使用其他属性。去here 详细解释。

      【讨论】:

        最近更新 更多