Android中的“ finishAffinity();”和“ finish()”方法有什么区别?

时间:2018-11-27 07:22:47

标签: java android performance android-lifecycle

我在登录屏幕上使用了一些代码,如果用户不想登录,则该应用程序将强制关闭应用程序。如果用户选择不登录/取消,它将调用该代码以退出应用程序。我已经成功地通过以下两种方式(不是同时)完成了这两种方式:

finishAffinity();
 System.exit(0);

finish();
 System.exit(0);

然而,这两行代码似乎都在做同样的事情...该应用程序已对用户关闭,但如果用户单击“概述”按钮,他们可以选择重新打开该应用程序,但仍保留在后台应用程序中以重新打开。 (这只是重新启动登录提示。)

由于我没有发现功能上的区别,所以我想知道finishAffinity()finish()方法之间的区别是什么?

奖励问题:另外,有没有一种方法可以完全关闭该应用程序,因此它也不会出现在概述按钮应用程序列表中?

4 个答案:

答案 0 :(得分:5)

finishAffinity()finishAffinity()不用于“ 关闭应用程序”。它用于从当前任务中删除许多属于特定应用程序的活动(其中可能包含属于多个应用程序的活动)。

即使您完成了应用程序中的所有活动,托管应用程序的OS进程也不会自动消失(就像您调用System.exit()时一样)。 Android最终会解决您的问题。您对此无能为力(这是故意的)。

finish():在活动中调用finish()时,将执行方法onDestroy(),该方法可以执行以下操作:

  • 关闭该活动正在管理的所有对话框。

  • 关闭活动正在管理的所有游标。

  • 关闭所有打开的搜索对话框。

答案 1 :(得分:2)

  

finishAffinity()

完成此活动以及当前任务中紧随其后的所有具有相同关联性的活动。

  

完成()

完成活动并应将其关闭时调用此函数。通过 onActivityResult() ActivityResult 传播回发起您的人。

有关更多信息,请访问以下链接: https://developer.android.com/reference/android/app/Activity

答案 2 :(得分:1)

  

finishAffinity():

关闭当前堆栈中存在的所有活动

  

finish()

仅关闭打开的活动

  

还有一种方法可以完全关闭该应用程序,因此它也   没有出现在概述按钮应用程序列表中?

是的,您可以为此目的在android:noHistory="true"的{​​{1}}中添加activities tag

答案 3 :(得分:0)

finishAndRemoveTask()方法从堆栈中弹出所有活动,并从最近的任务列表中删除该应用程序,只需简单地完成此当前活动以及当前任务中紧随其后的所有具有相同相似性的活动, finish()方法从堆栈中弹出您当前的活动。  有关详细文档link

finishAffinity():完成当前活动以及当前任务中紧接其下的所有具有相同相似性的活动。 finishAndRemoveTask():在完成活动并应将其关闭并且在完成任务的根活动的一部分时应将其完全移除的情况下调用此函数。