2017-10-04 30 views
1

问题

我试图找出管理活动堆栈以优雅地处理注销和退出的最佳方法。这些类似的问题似乎都没有解决这个问题。如何在活动堆叠时退出(以避免在注销/返回期间重绘)?

我想在活动堆栈上保留LoginActivity以避免在用户注销或回退时显示空白屏幕。这样做会导致戒烟。

* 退出=打我的 “退出” 菜单项,它发送一个广播,呼吁结束()或finishAndRemoveTask(),然后System.exit(0)


形势

如果这是用户第一次登录此设备,他们遵循流程图1

流程1: LoginActivity> TermsActivity> PrivacyActivity> MainActivity

流程2: LoginActivity> MainActivity


  • 在流程1中,PrivacyActivity清除活动堆栈当它开始MainActivity

    退出正常工作

    注销显示了一个短暂黑屏,因为它需要重绘

  • 流入2,LoginActivity不调用finish(),所以它仍然是活动堆栈

    记录了外表光滑,如LoginActivity并不需要重绘

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


途径

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

  • 总是调用finish()开始下一个活动
  • 添加机器人:noHistory = “真”到清单中的活动

我不喜欢这些,因为:

  • 这将导致一个(暂时的)空白LoginActivity当用户注销MainActivity的
  • 流入1,第3个活动都应该是“backable” - 该方法导致(简述)空白屏幕回击时

另一个建议的方法是使用startActivityForResult()而向前移动,然后在onActivityResult(该反应),同时向后移动小号

  • onActivityResult()时的onResume()前右调用,但有这种情况发生在LoginActivity的onCreate()和在onStart()的东西,一堆
    • 我想MainActivity的退出过渡是标准“缩小到中间”一个
    • 我担心戒烟会导致过渡到LoginActivity,一个(很短但并不明显)的空白灰色等待/闪光,然后退出
    • 更多活动将在稍后添加 - 这可能导致不得不遍历一系列活动以退出
    • 如果在启动MainActivity时将TermsActivity和PrivacyActivity从堆栈中移除,我不确定这是否会导致LoginActvity.onActivityResult()被调用,因为它是启动MainActivity的PrivacyActivity。

问题

我怎样才能保持在栈上的活动(在情况下,用户打回或注销),但清除栈,而戒烟?

+0

就这样我们很清楚,当用户按Home按钮时,你是否打电话“退出”?或者实际上杀了应用程序(通过将它从最新状态中删除)?或者在代码中实现的逻辑? – NSimon

+0

我应该更具体:我有一个“退出”菜单项[1]根据API版本[3]调用发送广播[2]调用finish()或finishAndRemoveTask()调用System.exit(0) – CanProgram

回答

0

继您对“退出”的评论之后,我会采用一种将活动封装在任务中的方法。

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

这样: - 按回到里面如预期任务1将导航(和你已经有) - 从MainActivity回来将关闭应用程序(从技术上说,我不期望在按下时注销)。

您必须执行的唯一逻辑是: - 退出会清除堆栈跟踪(如您所见) - 注销将启动LoginActivity并终止MainActivity(1)。

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

+0

谢谢,但这并不能解决问题。我试了1个任务([LA,MA]),2个任务([LA,TA,PA],[MA])和3([LA],[TA,PA],[MA])。行为似乎是相同的。如果LA调用完成(),退出只能正常工作,但这会导致注销期间出现空白屏幕。如果LA没有调用finish(),注销很不错,但由于LA尚未完成,因此退出会将应用程序保留在Overview中。我退出的行动并未真正清除活动堆栈,这似乎是潜在的问题。 – CanProgram

0

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

+0

你可能是对的。我一直在推迟将应用程序转换为使用片段,因为我预计它会花费相当长的时间,而且更高级别的人很快就会推出v1.0版本,所以我认为我将不得不每次完成()LoginActivity,现在只接受空白的灰色屏幕。 – CanProgram