```
请提供一行代码,以关闭整个安卓应用程序。
```请提供一行代码,以关闭整个安卓应用程序。
```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必须有一个独立的应用程序列表,它认为正在运行,而不是实际检查应用程序是否真的在运行。
System.exit(0)
来退出 Android 应用程序。这基本上是 Java 命令,Android 已经支持/移植过来了。毕竟,Android 基本上就是 Java 加上其他一些东西。 :) - ChuongPhamandroid.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);
finish()
结束task:
Activity.finish()
关闭主Activity,我认为它会关闭所有活动。也许您可以覆盖默认函数,并以静态方式实现,我不确定。