当我们使用FLAG_ACTIVITY_NEW_TASK清除活动堆栈时,OnDestroy不会触发



在android中,让我们假设我有以下活动

活动A->活动B->活动C->活动D

在某些场景中,我必须直接从活动D导航到活动A(例如:注销场景(。在这种情况下,我使用以下方法清除backstack并导航到活动A;再次打开应用程序。

// Go to LoginActivity.java
Intent intent = new Intent(this, LoginActivity.class);
intent.addFlag(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();

它绝对运行良好!毫无疑问。

我现在需要什么

当我从活动D导航到A时(使用FLAG_ACTIVITY_NEW_TASK。(我希望执行活动D、C、B的OnDestroy()方法。但它目前还没有命中/触发。

为什么我希望调用OnDestroy方法

在清除后堆栈时,我需要从所有活动中调用一个trackevent(取消注册(方法。例如:从活动D、C和B。因此,我希望OnDestroy方法可以调用(或者任何方法都可以(。请帮我一下?

根据文档

FLAG_ACTIVITY_CLEAR_TOP:如果要启动的"活动"的实例已存在于后堆栈中,则销毁其上的任何其他"活动">并将Intent路由到该现有实例。当与FLAG_ACTIVITY_NEW_TASK一起使用时,此标志将定位任何任务中"活动"的任何现有实例,并将其置于前台。

您可以通过将Intent.FLAG_ACTIVITY_CLEAR_TASK替换为Intent.FLAG_ACTIVITY_CLEAR_TOP来实现。

修改后的代码:

Intent intent = new Intent(this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

因此,将调用后堆栈onDestroy方法中的所有活动,包括您的LoginActivity's onDestroy方法,顺序与它们插入的顺序相同。

finishAffinity();
startActivity(new Intent(this,ActivityA.class));

若要在清除后从最后一个(ActivityD(导航到第一个活动(ActivityA(,请尝试上面的代码。

  1. 使用从后台清除所有活动
  2. 之后调用活动

最新更新