如何以编程方式退出Android应用程序

13 浏览
0 Comments

如何以编程方式退出Android应用程序

我找到了一些用于在Android应用程序中以编程方式退出的代码。通过在onDestroy()中使用以下任何一种代码,它会完全退出应用程序吗?

  1. System.runFinalizersOnExit(true)

    (或者)

  2. android.os.Process.killProcess(android.os.Process.myPid());

我不希望在点击退出按钮后将我的应用程序运行在后台。

请告诉我是否可以使用其中任何一种代码来退出我的应用程序?如果可以,我应该使用哪种代码?这是在Android中退出应用程序的好方法吗?

0
0 Comments

如何在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()会。至少这就是我的测试结果。

0
0 Comments

问题的出现原因是因为需要在Android应用程序中编程退出应用程序,但是使用getActivity().finish();System.exit(0);这两种方法并不是最佳解决方案。其中System.exit(0);方法会导致用户从Firebase中注销,并且在重新启动应用程序后需要重新登录,还会清除共享首选项、权限等。

解决方法是通过其他方式来退出应用程序,而不是使用System.exit(0);方法。

0
0 Comments

问题的出现原因是:如果只使用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),因为你不需要手动释放内存,系统会在需要时自动释放。这是预期的行为。

0