如何在活动处于堆叠状态时退出(以避免在注销/退回期间重新绘制)?

时间:2017-10-04 14:09:35

标签: android android-activity

问题

我正在尝试找出管理活动堆栈的最佳方法,以便优雅地处理退出和退出。似乎没有类似的问题可以解决这个问题。

我想在活动堆栈上保留LoginActivity,以避免在用户注销或点击时显示空白屏幕。这样做会让人心烦意乱。

* 退出=点击我的“退出”菜单项,它发送广播,调用finish()或finishAndRemoveTask(),然后调用System.exit(0)

情况

如果这是用户首次登录此设备,则会按照流程1

流量1: LoginActivity> TermsActivity> PrivacyActivity> MainActivity

流程2: LoginActivity> MainActivity

  • 在Flow 1中,PrivacyActivity在启动MainActivity时清除活动堆栈

    退出正常工作

    退出显示一个空白屏幕,因为它需要重绘

  • 在Flow 2中,LoginActivity不会调用finish(),因此它会保留在活动堆栈上

    注销看起来很流畅,因为LoginActivity不需要重绘

    退出不起作用 - 当MainActivity完成时,会显示LoginActivity。即使我使用System.exit(0),应用程序也会被最小化,而不是真正关闭。当用户点击“概览”按钮时,该应用仍然存在,可以重新打开(到LoginActivity)。

途径

对其他问题的建议答案不满意:

  • 在开始下一个活动时始终调用finish()
  • 向清单
  • 中的活动添加android:noHistory =“true”

我不喜欢这些因为:

  • 当用户退出MainActivity时,这会导致(简要)空白的LoginActivity
  • 在流程1中,前三个活动都应该“可以退回” - 这种方法在击退时会(短暂地)显示空白屏幕

另一种建议的方法是在向前移动时使用startActivityForResult(),然后在向后移动时对onActivityResult()中的做出反应

  • onActivityResult()在onResume()之前调用,但是在LoginActivity的onCreate()和onStart()中发生了很多事情。
    • 我希望MainActivity的退出过渡到标准的“缩小到中间”一个
    • 我担心退出会导致过渡到LoginActivity,一个(短但不是不明显)等待/闪烁的空白灰色,然后退出
    • 稍后会添加更多活动 - 这可能导致必须遍历一系列活动才会退出
    • 如果在启动MainActivity时从堆栈中删除了TermsActivity和PrivacyActivity,我不确定这是否会导致调用LoginActvity.onActivityResult(),因为它是启动MainActivity的PrivacyActivity。

问题

如何在堆栈中保留活动(如果用户回击或注销),但在退出时清除堆栈?

2 个答案:

答案 0 :(得分:0)

在你关于" quitting"的评论之后,我会有一种方法将活动封装在任务中。

任务1将是(0)  LoginActivity> TermsActivity> PrivacyActivity 任务2将从(0)开始   MainActivity

这样:   - 按回Task1内部将按预期导航(和您已有的一样)   - 从MainActivity按回来将关闭应用程序(从技术上讲,我不希望在按下时退出)。

您必须实施的唯一逻辑是:    - 退出将清除堆栈跟踪(如您所示)    - Logout将启动LoginActivity并终止MainActivity(1)。

(0)和(1):将标志FLAG_ACTIVITY_NEW_TASK添加到您的Intent https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK

答案 1 :(得分:0)

我认为你能做的最好的事情就是实现片段,处理堆栈会更容易。