【问题标题】:How to clear all activities in Android app如何清除 Android 应用中的所有活动
【发布时间】:2016-08-03 19:35:31
【问题描述】:

我的应用有许多可以按任意顺序调用的活动

示例活动历史记录: A -> B -> C -> D -> A -> B -> E

现在在活动 E 中,我正在“取消注册”设备(将用户注销,并删除他们可能已下载到其 SD 卡的所有数据)。期望的行为是应用程序“重新开始”,并提示用户登录活动,然后回击将使用户返回主屏幕。

所以现在,活动 E 应该以某种方式清除活动堆栈。目前,我在从 E 启动 A 的 Intent 时设置 FLAG_ACTIVITY_CLEAR_TOP。问题是,当用户访问 A,然后转到中间活动并在转到 E 之前重新访问 A 时,堆栈上仍有活动。

A -> B -> C -> D -> A

所以用户已经注销并且不能使用活动 B-D,但是如果用户从活动 A 回击,他们可以访问活动 B-D。有没有一种简单的方法可以从堆栈中清除除登录活动之外的所有活动?

更新:

所以我尝试更新我的 BaseActivity(我的应用程序中的每个 Activity 都是这个的子类)以包含一个静态标志 isDeregistering,它告诉 Activity 如果为真则自行销毁。问题是,每个活动都调用完成(),我被引导到主屏幕并且无法重新启动应用程序,直到强制关闭应用程序。有没有更好的方法来做到这一点?

【问题讨论】:

  • 这很奇怪,通读 FLAG_ACTIVITY_CLEAR_TOP 上的文档,它说:例如,考虑一个由以下活动组成的任务:A、B、C、D。如果 D 调用 startActivity() 的 Intent 是解析到活动 B 的组件,然后 C 和 D 将完成并且 B 接收给定的 Intent,导致堆栈现在是:A,B。这似乎意味着如果您使用该标志开始对 A 的意图,所有中间活动应该结束了……
  • 是的,这就是行为,只有 A 活动在堆栈中两次。当堆栈被清除时,它会在调用活动和接收活动的第一个实例之间清除,因此 A 活动的两个实例之间的任何内容都保留在堆栈上。

标签: android


【解决方案1】:

我想出了一个可行的解决方案。以下代码进入我的 BaseActivity 类。

    public boolean killIfDeregistering() {
    if (isDeregistering) {
        Log.d(TAG, "deregistering true!");
        if (getClass().getName().equals(LoginActivity.class.getName())) {
            //don't destroy activity, reset flag
            Log.d(TAG, "stopping deregister process!");
            isDeregistering = false;
        } else {
            //finish the activity
            Log.d(TAG, "killing this activity!");
            finish();
            return true;
        }
    }
    return false;
}

使用一点反射,我可以决定是否终止基本活动,以便主页启动器可以在LoginActivity 处重新启动应用程序。我只需要通过手动调用finish() 来确保 LoginActivity 在执行登录后不会保留在堆栈中。

【讨论】:

    【解决方案2】:

    如果你想从活动 E 回到第一个活动 A,销毁所有中间活动,你可以使用 FLAG_ACTIVITY_CLEAR_TASK | 启动你的意图。 FLAG_ACTIVITY_CLEAR_TOP

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 2011-05-10
      • 1970-01-01
      相关资源
      最近更新 更多