如何以编程方式退出Android应用程序
如何在Android应用程序中以编程方式退出
自API 16以来,您可以使用finishAffinity方法,根据其名称和Javadoc描述,它似乎非常接近关闭所有相关活动:
this.finishAffinity();
此方法将关闭当前任务中与此活动具有相同关联性的所有活动。当应用程序可以启动到另一个任务(例如从它所理解的内容类型的ACTION_VIEW)并且用户使用向上导航从当前任务切换到自己的任务时,通常会使用此方法。在这种情况下,如果用户在第二个应用程序的任何其他活动中导航到下一个活动,则应将所有这些活动从原始任务中移除,作为任务切换的一部分。
请注意,此finish不允许您向上一个活动交付结果,并且如果您尝试这样做,将抛出异常。
自API 21以来,您可以使用非常相似的命令
finishAndRemoveTask();
此方法将关闭此任务中的所有活动并将其从最近任务列表中删除。
您可以分别对每个活动进行finish(),无论是在关闭应用程序时还是在活动生命周期内。
清除第二个应用程序中的所有活动,并导航回第一个应用程序!解决我的问题;-)
当我调用getActivity().finishAffinity()时,单击应用程序图标时它不会调用我的Application类,而System.exit(0)会工作。
警告! this.finishAffinity()关闭应用程序并将其从内存中移除,因此您将无法接收推送消息等。
finishAndRemoveTask()在Android N HTC One m9设备上不起作用。它只完成当前活动。finishAffinity()可以。
此解决方案在99%的情况下有效。然而,它不会销毁进程,所以例如Dagger将不会被清除。在那些需要杀死进程的罕见情况下,System.exit(0)是唯一对我有效的解决方法。
finishAffinity()关闭我的应用程序,但是当我使用深度链接启动它时,它仍然保持在后台。有人知道如何停止深度链接启动应用程序吗?但是以下代码片段不会完全停止我的应用程序(我minSdk = 19):
public void onStopButton(View view) {
this.finishAffinity();
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
}
这只是冻结我的应用程序。
另外,我还可以补充一点,即使用Koin时,您也会遇到此问题。即使您使用finishAndRemoveTask,重新打开应用程序后它仍会在内存中保留实例。finishAffinity + System.exit(0)帮助了我。
你很受欢迎,但是只要让你知道System.exit(0)并不是很好的解决方法。我不记得我是如何替换它的,因为它在另一个我无法访问的项目中。抱歉。
曾经有人宣扬即使有退出按钮也不要以编程方式退出应用程序,我从未同意这一观点。我注意到Fortnite提供了一个对话框,请求禁用开发者模式,然后在运行其应用程序时如果调试开启,经过一段时间关闭应用程序。这是一个特别好的例子,说明为什么您可能希望以编程方式退出。
请注意,finishAndRemoveTask()和finishAffinity()并不相同!如果您的回退堆栈上有各种其他Activity,您还希望完成它们,您必须调用finishAffinity()而不是finishAndRemoveTask(),因为后者不会完成回退堆栈上的所有其他现有Activity,而finishAffinity()会。至少这就是我的测试结果。
问题的出现原因是:如果只使用finishAffinity()而不使用System.exit(0),应用程序会退出,但分配的内存仍然被手机使用。因此,如果想要彻底退出应用程序并释放内存,应同时使用这两个方法。
解决方法是:在退出按钮或对话框的点击事件中添加以下代码:
finishAffinity(); System.exit(0);
这是最简单的方法,可以在任何地方使用,真正地退出应用程序,即使有很多活动仍然打开,也可以顺利退出所有活动。
如果想要一个更友好的界面,可以使用带有三个按钮(是、否、取消)的对话框。示例代码如下:
// 创建退出应用程序的对话框 AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); // 设置对话框标题 alertDialogBuilder.setTitle("your title"); // 设置对话框信息 alertDialogBuilder .setMessage("your message") .setCancelable(false) .setPositiveButton("YES", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // 点击是时的操作 finishAffinity(); System.exit(0); } }) .setNeutralButton("CANCEL", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // 点击取消时的操作 dialog.cancel(); } }) .setNegativeButton("NO", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // 点击否时的操作 dialog.cancel(); } }); AlertDialog alertDialog = alertDialogBuilder.create(); alertDialog.show();
请注意,不要使用System.exit(0),因为你不需要手动释放内存,系统会在需要时自动释放。这是预期的行为。