有一个问题要问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()
方法。您只需更改清单文件中该特定Activity
的launchMode
即可执行此操作。<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()
方法。您将收到QuizActivity
在ResultActivity
onActivityResult
函数中传递的分数。 - 另一种方法是将
QuizActivity
作为启动器,它将包含问题,提交答案后,将计算分数,并以获得的分数打开ResultActivity
。我想建议这两项活动都有launchMode=SingleTask
。通过单击ResultActivity
中的按钮将启动另一个QuizActivity
。