使用 finish() 手动"end"活动:To or Not to?



有一个问题要问Android开发人员。在过去的几个月里,我一直在参加 Udacity Android 初学者课程,并且有一位同学告诉我,当我转到新活动时,我应该根据我的意图调用finish()方法。我用谷歌搜索并查看了开发人员文档,试图发现他从哪里了解到这种方法以及文档对调用它的内容,但我只能找到关于它如何工作的一般性解释,而不是关于何时调用它以及为什么调用它。

我了解内存中的堆栈是什么,他提到它可以清除该堆栈,但我读到Android会自行处理此问题,我们无需担心。我在 Stack Overflow 上检查了另一个问题,它与我提出的问题类似,但没有完全回答这个问题:我是否需要在我的意图上显式调用finish()方法,或者 Android 是否处理这个问题?如果我确实需要调用finish(),调用它的最佳实践是什么?作为参考,如果我的问题由于某种原因不清楚,这里有一些来自我的应用程序的示例代码和一个指向 GitHub 存储库的链接:

Intent nextIntent= new Intent(OtherActivity.this, MainActivity.class); 
startActivity(nextIntent); 
finish(); 

如果您调用finish(),android 会将您的活动从活动堆栈中删除。如果您不调用它,活动将保留在堆栈中,如果您在 android 手机上按返回按钮,默认行为是 android 将弹出堆栈上的顶部活动。您当然可以覆盖后退按钮功能。在活动上调用 finish 的最常见用法是当您不想返回到此活动时,例如,如果您有初始屏幕活动。当您离开它时,您可能希望调用它完成。其他用例完全取决于特定于应用程序的导航层次结构和性能目标。

No.您不必在每个Activity转换中调用finish(),因为 Android 可以正确处理堆栈。但是,您可能需要在多个位置进行显式finish()调用。例如

  • 当您通过调用startActivityForResult启动Activity并从启动Activity开始时,您希望使用setResult将结果传递回调用Activity。然后,在某些情况下,您可能需要在将结果发送到调用Activity后启动finish()Activity
  • 当您打开一个DialogActivity时,您可能有一些逻辑,您希望DialogActivity消失。然后显式调用finish()函数。
  • 全屏Activity可能需要禁用onBackPressed,因为您将使用关闭按钮关闭Activity。在这种情况下,您需要在按下Activity中的关闭按钮时显式调用finish()方法。
  • 如果您打算关闭后退堆栈中的所有其他Activity,同时启动特定Activity,则在启动需要转到该特定Activity的每个Activity后,也无需调用finish()方法。您只需更改清单文件中该特定ActivitylaunchMode即可执行此操作。

    <activity
    android:name=".ClearBackStackActivity"
    android:label="You want to clear the back stack of activities"
    android:launchMode="singleTask">
    

更新

所以为了澄清,我有一个测验活动,可以让你回答 问题。当您提交测验时,您将被带到结果 活动。理想情况下,我是否要将测验活动本身设置为 在统计结果并传递给结果后清除 活动?这能达到预期目标并节省内存吗? 我不知道我在这里问的这是否有意义。

据我了解,您希望在提交所有答案并将用户移动到结果活动后清除测验活动。在这种特定情况下,我可以向您建议两种不同的方法。

  • 您可以考虑使用ResultActivity作为启动器。要开始测验,您可以考虑使用startActivityForResult盯着QuizActivity,然后在提交QuizActivity中的答案后,您正在计算分数并使用QuizActivity中的setResult再次将分数传递给ResultActivity,然后在QuizActivity上调用finish()方法。您将收到QuizActivityResultActivityonActivityResult函数中传递的分数。
  • 另一种方法是将QuizActivity作为启动器,它将包含问题,提交答案后,将计算分数,并以获得的分数打开ResultActivity。我想建议这两项活动都有launchMode=SingleTask。通过单击ResultActivity中的按钮将启动另一个QuizActivity

相关内容