关闭安卓应用程序

36
请建议如何用一行代码关闭整个安卓应用程序。
```

请提供一行代码,以关闭整个安卓应用程序。

```

为什么你要规定它必须只有一行代码?很可能需要更多的行数。 - atreat
12个回答

85
是的 - 为什么,然后是如何(有点):
简短回答:
System.exit(0);

这样可以完美而干净地终止专门运行应用程序的整个Java虚拟机。但是,您应该从主活动(main activity)中执行此操作,否则Android可能会自动重新启动您的应用程序。(在Android 7.0上测试过)

为什么这是一个好问题以及程序员可能有非常合理的理由以这种方式终止其应用程序的详细信息和说明:

我真的看不出来对于寻找终止他们的应用程序方法的人粗鲁的说话有什么收获。

对于初学者,Good是一个友好的提醒,也就是在Android上,您不必担心关闭您的应用程序 - 但是有些人确实想要终止他们的应用程序,即使他们知道他们没有必要这样做 - 而他们如何做到这一点是一个合法的问题,具有有效的答案。

也许许多人生活在一个理想的世界中,并没有意识到存在一个真实的世界,在那里真正的人们试图解决真正的问题。

事实是,即使使用android,它仍然是一台计算机,该计算机仍在运行代码,因此可以完全理解为什么有人希望真正退出他们的"应用程序"(即属于他们的应用程序的所有活动和资源)。

的确,Google的开发人员设计了一个系统,在这个系统中,他们相信不会有人需要退出他们的应用程序。也许99%的时间他们是正确的!

但是,允许数百万程序员为一个平台编写代码的惊人之处在于,其中一些人将尝试推动平台到其极限,以执行令人惊异的任务!-包括Android开发人员从未梦想过的事情!

关闭程序的另一个需求是进行故障排除。这正是我来到此线程的原因:我正在学习如何利用音频输入功能进行实时DSP。

现在不要忘记我说过以下内容:我很清楚当我做得对时,我不需要杀死我的应用程序重置音频接口。

但是:记住,完美的应用程序不是从一开始就完美的应用程序!它们从刚刚能工作的应用程序开始,并逐渐变成适当的理想应用程序。

所以我发现我的小型音频示波器测试应用程序很棒,直到我按下Android Home按钮。然后,当我重新启动我的示波器应用程序时,再也没有音频进来了。

起初,我只是使用除以零来崩溃它-而那很好用。但我决定寻找更好的方法-这就让我来到了这里!

所以这是我尝试的方式以及我发现的:

背景: Android系统基于Linux。 Linux和Windows一样具有进程和进程ID(PID),只不过更好用。 要查看在连接到USB上的Android设备上正在运行的所有进程,请运行adb shell top,您将得到Linux系统下所有正在运行的进程的更新列表。

如果您的PC上也有Linux,则可以输入

adb shell top | egrep -i '(User|PID|MyFirstApp)' --line-buffered

以仅获取名为MyFirstApp的应用程序的结果。您可以查看运行该名称下的多少个Linux进程以及它们消耗了多少CPU资源。

(类似于Windows中的任务管理器/进程列表)

或者,如果您只想查看正在运行的应用程序:

adb shell top | egrep -i '(User|PID|app_)' --line-buffered

您还可以通过运行adb shell kill 12345 来关闭设备上的任何应用程序,其中12345是它的PID号码。

据我所知,每个单线程应用程序只使用一个Linux进程。

因此,我发现(当然)如果我只激活Android Home选项,我的应用程序将继续运行。 而且如果我使用Activity.finish(),它仍然会保留进程运行。 除零会终止正在运行的Linux进程。 在应用程序内部杀死PID似乎是到目前为止我发现最好用的方法,至少用于调试目的。

最初,我通过在我的MainActivity.java中添加一个导致除零的按钮来解决杀死我的应用程序的需求:

public void exit(View view)
{
    int x;
    x=1/0;
}

然后在我的布局XML文件中,针对该按钮的部分,我只需设置android:onClick="exit"。

当然,除以零很麻烦,因为它总是显示“此应用程序已停止...”或其他类似的错误信息。

所以我试了一下finish,就像这样:

public void exit(View view)
{
    finish();
}

这导致该应用程序从屏幕上消失,但仍在后台运行。

然后我尝试:

public void exit(View view)
{
      android.os.Process.killProcess(android.os.Process.myPid());
}

到目前为止,这是我尝试过的最好的解决方案。

更新:这与上面相同,它会立即终止Linux进程和应用程序的所有线程:

public void exit(View view)
{
      System.exit(0);
}

该线程将立即进行一个完整的退出,而不会向用户报告应用程序已崩溃。

应用程序使用的所有内存将被释放。(注意:实际上,您可以在清单文件中设置参数,使不同的线程在不同的Linux进程中运行,因此情况可能更加复杂。)

至少对于快速而简单的测试,如果您绝对需要知道线程实际上已经完全退出,kill命令可以很好地解决这个问题。但是,如果您正在运行多个线程,则可能需要从每个线程内部终止每个线程。

编辑:这是一个有关此主题的很好的链接:http://developer.android.com/guide/components/fundamentals.html 它解释了每个应用程序如何在其自己的虚拟机中运行,并且每个虚拟机都在其自己的用户ID下运行。

这是另一个很好的链接,它解释了(除非在清单中另有规定)一个应用程序及其所有线程都在单个Linux进程中运行:http://developer.android.com/guide/components/processes-and-threads.html

因此,作为一般规则,应用程序确实是在计算机上运行的程序,应用程序确实可以完全终止,立即从内存中删除所有资源。

(通过“立即”我指的是尽快--不是等到需要内存时。)

PS:曾经想过为什么您要接听Android手机或启动您最喜欢的应用程序时它会冻结一秒钟吗?曾经因为疲倦而重新启动过吗?这可能是由于在上周运行的所有应用程序中,您认为已退出但仍然挂起并使用内存。当手机需要更多内存时,手机会杀死它们,从而导致您想要执行的任何操作之前出现延迟!

更新Android 4/Gingerbread版本:同上所述,但即使一个应用程序退出或崩溃并且其整个Java虚拟机进程都已关闭,它仍将显示为在应用程序管理器中正在运行,并且您仍然具有“强制关闭”选项或其他选项。 4.0必须有一个独立的应用程序列表,它认为正在运行,而不是实际检查应用程序是否真的在运行。


4
嘿,虽然你在这里的积分不多,但我想感谢你给出这个又长又有帮助的答案。当前排名第一的“你不需要这样做”的回答毫无用处,如果没有进一步的解释。而你的答案则恰好解释了我所需要的。 - Achal Dave
不需要任何花哨的代码,只需尝试使用 System.exit(0) 来退出 Android 应用程序。这基本上是 Java 命令,Android 已经支持/移植过来了。毕竟,Android 基本上就是 Java 加上其他一些东西。 :) - ChuongPham
是的!谢谢!System.exit(0) 绝对是最好的方法。在发现 System.exit() 之前,我已经写了上面大部分的内容,但我留下它是为了帮助人们更好地理解情况。谢谢! - Jesse Gordon
@JesseGordon:我有同样的需求来关闭应用程序。我使用了System.exit(0),它有效。尽管有时我会收到崩溃对话框-“很遗憾<应用程序名称>已停止”(我不希望出现)。我该如何防止/避免该对话框?而且,“杀死进程”功能是否与System.exit(0)相同? - Basher51
@Basher51:这是一个有趣的问题。我只会在应用程序违反某些规则时才期望看到“不幸的是…”的消息,而不是在使用System.exit(0)干净地退出时。我的猜测是,也许你还有另一个代码问题,导致了违规行为,比如除以零等。尝试通过Eclipse调试器运行应用程序,这样当应用程序退出时,你就可以看到错误消息的详细信息。很抱歉我没有更多有用的信息!~Jesse - Jesse Gordon
我使用了异常抛出的方法。 - Ahmed Mahmoud

12

1
我希望通过单个调用完成所有活动。 - Amit
1
是的,但它只关闭一个活动,而不是属于应用程序的所有活动。 - jellyfish
1
finish() 只会关闭当前活动,但是其他的和 Java 虚拟机仍在运行。system.exit(0) 会关闭整个应用程序。 - Jesse Gordon
有没有办法关闭应用程序本身,而不仅仅是关闭活动? - Kiran Maniya
好的,这对于单一活动应用程序非常有用。谢谢。 - Sohail Shrestha

4
您可以通过调用System.exit(0)来关闭您的Android应用程序。

3
没问题。每个应用都在其自己的Java虚拟机中运行,这是一个单独的Linux进程/任务。当使用System.exit(0)命令时,会终止运行该应用程序的Java虚拟机,并将其完全关闭。否则,JVM和应用程序将在内存中保持数天或数周。 - Jesse Gordon
这应该是第一个答案。 - Jesse Gordon

2

在这之前,请阅读这个问题

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

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

这段代码会终止操作系统中的进程。使用此代码会干扰操作系统。因此,我建议您使用以下代码:

this.finish();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

2
在需要结束Activity的方法中调用finish(),例如在onCreate()方法中,在该方法的末尾添加finish(),这样你会看到Activity在创建后立即结束!

2
根据我的了解,finish函数只能关闭当前显示的屏幕。 请参考此示例(查看'plusminus'给出的答案),它一定能帮助您关闭应用程序。

2
答案取决于你所说的“关闭应用程序”的含义。在安卓中,它可以是关于一个“activity”,或者是一组按时间或祖先顺序排列的活动,称为“task”。
结束activity:只需调用finish() 结束task:
  1. 清除activity任务栈
  2. 导航到根activity
  3. 然后在其上调用finish。
这将结束整个“task”。

1
不是一行代码解决的问题,但相当容易: 子类化Activity,然后重写并添加finish()到onPause()方法。 这样,一旦activity进入后台,它就会消失,因此应用程序不会保留活动堆栈,您可以finish()当前Activity,应用程序就会关闭!

0
如果您使用Activity.finish()关闭主Activity,我认为它会关闭所有活动。也许您可以覆盖默认函数,并以静态方式实现,我不确定。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接