繁体   English   中英

使用finish()手动“结束”活动:到还是不到?

[英]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()方法。 您只需在清单文件中更改该特定ActivitylaunchMode即可。

     <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 您将收到通过分数QuizActivityonActivityResult在功能ResultActivity
  • 另一种方法是使用QuizActivity作为启动器,它将有问题,提交答案后,将计算分数,并使用获得的分数打开ResultActivity 我想建议两个活动都具有launchMode=SingleTask 通过单击ResultActivity的按钮将启动另一个QuizActivity

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM