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

What is the difference between `finishAffinity();` and `finish()` methods in Android?

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

finishAffinity();
 System.exit(0);

finish();
 System.exit(0);

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

由于我没有注意到功能上的差异,我想知道 finishAffinity()finish() 方法之间有什么区别?

奖励问题:另外,有没有办法完全关闭应用程序,使其也不会出现在概览按钮应用程序列表中?

finishAffinity():

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

finish()

关闭只打开activity

Also, is there a way to completely shut down the app, so it also doesn't appear in the overview button app list?

是的,为了这个目的,您可以将 android:noHistory="true" 添加到 Manifest.xml 中的 activities tag

finishAffinity()finishAffinity() 不用于“关闭应用程序”。用于从当前任务(可能包含属于多个应用程序的Activity)中移除属于特定应用程序的多个Activity。

即使您完成了应用程序中的所有活动,托管您的应用程序的 OS 进程也不会自动消失(就像您调用 System.exit() 时那样)。 Android 最终会在它绕过它时终止你的进程。你无法控制这个(这是故意的)。

finish() :在 activity 中调用 finish() 时,方法 onDestroy() 被执行,此方法可以执行以下操作:

  • 关闭 activity 正在管理的所有对话框。

  • 关闭 activity 管理的所有游标。

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

finishAndRemoveTask() 方法从堆栈中弹出您的所有活动并从最近的任务列表中删除应用程序简单地完成当前 activity 以及当前任务中具有相同亲和力的紧接其下方的所有活动, finish() 方法从堆栈中弹出当前 activity。 获取详细文档 link

finishAffinity():完成当前 activity 以及当前任务中紧接其下的具有相同亲和力的所有活动。 finishAndRemoveTask():当你的 activity 完成并且应该关闭并且任务应该作为完成根 activity 的一部分被完全删除时调用它任务。