[英]Using finish() to “end” an activity manually: To or Not to?
对Android开发人员有疑问。 在过去的几个月中,我参加了Udacity Android初学者课程,并有一个同学告诉我,当我转到新的Activity时,我应该在意图上调用finish()
方法。 我四处搜寻并查看了开发人员文档,以尝试发现他从哪里学到了该方法以及文档中关于调用该方法的内容,但是我只能找到有关其工作原理的一般性解释,而在何时调用它以及为什么调用它方面却了解不多。称它为。
我了解内存中有什么堆栈,他提到了清除堆栈的方法,但我读到Android会自行处理它,我们无需担心。 我在此处检查了Stack Overflow上的另一个问题,该问题与我所询问的问题类似,但并没有完全回答该问题:我是否需要在意图上显式调用finish()
方法,还是Android可以处理此问题? 如果确实需要调用finish()
,那么调用它的最佳实践是什么? 作为参考,如果由于某些原因我的问题不清楚,这是我的应用程序中的一些示例代码,以及指向GitHub存储库的链接 :
Intent nextIntent= new Intent(OtherActivity.this, MainActivity.class);
startActivity(nextIntent);
finish();
如果您调用finish()
,则android将您的活动从活动堆栈中移除。 如果您不调用它,该活动将保留在堆栈中,并且如果您在Android手机上按返回按钮,则默认行为是android将弹出堆栈中的顶部活动。 您当然可以覆盖后退按钮功能。 在活动上调用完成的最常见用法是当您不想回到该活动时,例如,如果您有启动画面活动。 当您离开它时,您可能想在其上调用finish。 其他用例完全取决于特定于应用程序的导航层次结构和性能目标。
不需要。由于Android会正确处理堆栈,因此您不必在每个Activity
过渡上都调用finish()
。 但是,您可能需要在多个地方进行显式的finish()
调用。 例如,
startActivityForResult
来启动Activity
,并希望从Activity
开始时,使用setResult
将结果传递回调用的Activity
。 然后,你可能需要finish()
的Activity
将结果发送到调用后,开始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
中的答案后,您正在计算分数,然后使用ResultActivity
中的setResult
将分数再次传递给QuizActivity
,然后在您的QuizActivity
调用finish()
方法QuizActivity
。 您将收到通过分数QuizActivity
在onActivityResult
在功能ResultActivity
。 QuizActivity
作为启动器,它将有问题,提交答案后,将计算分数,并使用获得的分数打开ResultActivity
。 我想建议两个活动都具有launchMode=SingleTask
。 通过单击ResultActivity
的按钮将启动另一个QuizActivity
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.