【问题标题】:android:clearTaskOnLaunch doesn't work How to clear the backstack when comes to foreground?android:clearTaskOnLaunch 不起作用如何在前台清除后台堆栈?
【发布时间】:2013-06-11 00:24:57
【问题描述】:

我的应用程序需要这种行为,“用户每次尝试启动它时都必须登录(直接触摸应用程序图标,或通过任务管理器或通过最近的应用程序)” 所以活动是按这个顺序排列的(认为App名称是Foo app)

  1. S - 启动画面
  2. L - 载入画面
  3. Lo - 登录屏幕
  4. M - 主菜单(有任务列表)
  5. T - 任务屏幕

“用户启动应用程序并按以下顺序进行: S -> L -> Lo(登录)-> M(选择其中一项任务)- > 任务屏幕

  • 所以当他在任务屏幕中时,他按下主页按钮,应用程序进入后台,他使用另一个应用程序。并再次使用 Foo 应用程序。所以在这个如果他按下返回按钮,它会显示之前正在使用的任务屏幕???如果再次按下返回按钮,它会再次进入主屏幕,依此类推...???

  • 这不应该发生,只是我想要的是,当应用程序进入前台时,用户需要登录并且永远无法返回任何屏幕。

注意:所有的屏幕都扩展了一个BaseActivity类,它扩展了Activity类。在那里我使用了 onResume()、onPause() 方法和另一个自定义方法来找出扩展子类何时暂停,并在应用程序来自后台时恢复!!!在某些屏幕中,我也不得不使用片段......!

提前感谢您的时间和帮助!

【问题讨论】:

  • 由于重复here(一个很好的答案,顺便说一句)和here而被否决
  • 如果用户按下 Home 或其他活动(传入拨号器),那么当用户返回到您的活动(通过应用程序图标或返回)时,他应该看到您的应用程序它在哪里。我还没有看到一个严肃和流行的 Android 应用程序表现不同......我看不出它不应该表现得这样的任何理由
  • 首先感谢两位 cmets。 @verybadalloc 嘿,在发布此内容之前,我也是这样回答的,但是我已经在我的应用程序中实现了那些东西,但没有给出预期的结果! :(
  • @gunar 您好 Gunar,如果您可以想象一个应用程序,您可以隐藏或锁定您通过应用程序选择的所有图像,并且在您需要访问这些图像的任何时候,您必须通过该应用程序登录,但不能直接在该应用程序的最后查看的照片库中登录。所以为了实现这种行为,我们需要实现上述场景
  • 当Activity backStack如下A -> B -> C -> D 当用户在 D 中时,他按下 Home 按钮,以他稍后再次启动应用程序的任何方式,我希望他回到 A活动,就像简单地将堆栈弹回 A!因为它是 Login Activity,我仍然无法解决这个问题!我可以在应用程序的任何地方找到,当它从后台返回到前台时,并使用 FLAG_ACTIVITY_CLEAR_TASK 将 Intent 传递给 StartActivity 方法,并且我已经在使用 **android:clearTaskOnLaunch="true" **,但是问题仍然存在!

标签: android onresume onpause application-restart


【解决方案1】:

将标签android:clearTaskOnLaunch="true" 添加到清单中的根(主)活动标签。然后用户将始终返回此活动。

要从任何其他活动跳转到登录,请使用:

public static void logoff(Context c){
    Intent logoff = new Intent(c,LoginActivity.class);
    logoff.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
    c.startActivity(logoff);
}

【讨论】:

  • 您好,谢谢您的回复,我想我也做过同样的事情,但实际上并没有奏效!那么创建静态方法的原因是什么?什么时候打电话?我的问题实际上是我也做同样的事情,并成功启动了一个新的登录活动或者可以进入启动画面,但问题是如果用户点击后退按钮,他/她仍然可以访问backstack上的previous Activity,是他上次使用的时候使用的! :((需要这种行为,以避免对应用内的信息提供保护)有什么帮助吗?
  • @Vishman logoff 方法会按照它说的做,它将用户从任何其他活动带回登录活动。用户无法通过按返回来撤消此操作,因为它会结束旧任务并开始新任务。这是静态的,因此可以从任何地方轻松调用。现在,将android:clearTaskOnLaunch="true" 添加到清单中的登录活动将确保当用户去某个地方并返回应用程序时,他会进入登录活动并在一个刷新的新任务中。(就像logoff 方法一样)另外,我建议使用片段并将启动/加载/登录片段仅放在登录活动中。
  • 你好,谢谢你的解释,我试试这个并告诉你结果好吗?
  • 当Activity backStack如下A -> B -> C -> D 当用户在 D 中时,他按下 Home 按钮,以任何他稍后再次启动应用程序的方式,我希望他回到 A活动,就像简单地将堆栈弹回 A!因为它是 登录活动,我仍然无法解决这个问题!我可以在应用程序的任何地方找到,当它从后台返回到前台时,并使用 FLAG_ACTIVITY_CLEAR_TASK 将 Intent 传递给 StartActivity 方法,并且我已经在使用 **android:clearTaskOnLaunch="true" **,但是问题仍然存在!
  • 对不起,伙计们,但说起来有点傻,但是通过获得以下answer的帮助,我找到了解决我问题的中途解决方案,希望这对大家有所帮助,以防万一你遇到了同样的问题。
【解决方案2】:

我不会争论为什么你的问题描述了一个不那么愉快的用户体验,但是你对下面的解决方案有什么看法呢?

Lo、MT 替换为片段。因此,在 L 之后,您将有一个活动 (PostL),您会在其中显示第一个 Lo 片段,然后在用户操作时,您将在 Lo 之上添加一个M片段由get(Supported)FragmentManager.beginTransation().add(id, fragment).commit(),然后继续你将用T替换M:get(Supported)FragmentManager.beginTransation().replace(id, fragment).commit()。 - 或者您可以在 M 之上添加 T,这是您的选择,因为它可能更适合。

在这个 PostL 活动中,在 onPause() 方法中,如果片段回栈由多个片段组成 - 底部片段是 Lo,您将只调用 get(Supported)FragmentManager.popBackStack()

当用户点击主屏幕并重新进入应用程序(无论从哪里)或任何其他应用程序进入前台时,这种方式都会被覆盖。此外,如果您正确考虑了 backstack 大小,如果用户点击返回,那么他将始终打开最后一个片段(可能是 M 或 Lo)。

我希望这是有道理的......

【讨论】:

  • 嗯,首先感谢您的建议。但这看起来像是一个全新的开发变化分支,我目前拥有大部分成品。无论如何,谢谢,如果我不能以任何其他方式解决这个问题,我也会尝试这个解决方案,我肯定会告诉你发生了什么好吗?:) 再次感谢!
  • 您不应该做这项工作,因为将Activity 迁移到Fragment 相对容易,反之亦然。它们的生命周期非常相似,回调也很相似,所以你不应该有太多的工作。您可以为此分配假设 2 小时,如果有效,那么好的,如果无效,您可以保持原样。
  • 感谢您的帮助!因此,如果我要使用此解决方案,我将不得不将所有其他任务从活动迁移到基于片段的方式,对吗?如果没有,以后会出问题。
  • 对不起,伙计们,但说起来有点傻,但是通过获得以下answer的帮助,我找到了解决我问题的中途解决方案,希望这对大家有所帮助,以防万一你遇到了同样的问题。
  • 从该答案中查看Radu 的评论。这是一种无所事事的骇人听闻的方式。
猜你喜欢
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多