是-为什么,然后如何(多种):
简短答案:
System.exit(0);
这很好地干净地终止了专用于运行该应用程序的整个java机器。但是,您应该从主要 Activity 中执行此操作,否则android可能会自动重新启动您的应用。 (在Android 7.0上进行了测试)
为什么这是一个好问题的详细信息和解释,程序员可能有一个非常合理的理由以这种方式终止其应用程序:
我真的没有看到与正在寻求终止其应用程序的人严厉交谈的好处。
Good是对初学者的友好提醒,在Android上,您不必担心关闭应用程序的麻烦-但有些人实际上确实想终止其应用程序,即使他们知道自己不必这样做-以及他们的问题这样做是一个带有有效答案的合法问题。
也许许多人生活在理想的世界中,却没有意识到在真实世界中,真实的人们正在努力解决实际的问题。
事实是,即使使用android,它仍然是一台计算机,并且该计算机仍在运行代码,并且完全可以理解为什么有人希望真正退出其“应用程序”(即,属于该应用程序的所有 Activity 和资源) )
确实,Google的开发人员设计了一个系统,他们认为没有人需要退出他们的应用程序。也许99%的时间他们是对的!
但是,允许数百万程序员为平台编写代码的一件令人惊奇的事情是,他们中的一些人将试图将平台推向极限,以便做出令人惊奇的事情! -包括Android开发人员梦dream以求的东西!
还需要能够关闭程序,这是为了进行故障排除。这就是带我进入此线程的原因:我只是在学习如何利用音频输入功能来进行实时DSP。
现在,请不要忘记我说了以下几点:我很清楚,当我一切都做对了之后,就无需杀死我的应用程序即可重置音频接口(interface)。
但是:请记住,完美的应用程序并非一开始就是完美的应用程序!它们最初只是勉强工作的应用程序,后来逐渐发展成为理想的应用程序。
所以我发现,直到我按下android Home按钮,我的小型音频示波器测试应用程序才能正常工作。然后,当我重新启动示波器应用程序时,不再有音频传入。
起初我会进入
Settings->Applications->Manage Applications->AppName->Force Stop.
(请注意,如果实际的Linux进程未运行,则“强制停止”按钮将被禁用。如果启用了该按钮,则Linux进程仍在运行!)
然后,我可以重新启动我的应用程序,它又可以正常工作了。
刚开始,我只是使用被零除来崩溃它-效果很好。
但是我决定寻找一种更好的方法-这使我着陆了!
因此,这是我尝试的方法以及发现的内容:
背景:
Android在Linux上运行。
Linux具有进程和进程ID(PID),就像Windows一样,只有更好。
要查看您的android上正在运行哪些进程(已将其连接到USB和所有设备),请运行
adb shell top
,您将获得android下android中运行的所有进程的更新列表。
如果您的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”。
当然,除以零是很麻烦的,因为它总是显示“此应用程序已停止...”或其他内容。
所以然后我尝试完成,像这样:
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);
}
它立即在不通知用户应用程序崩溃的情况下很好地退出了该线程。
该应用程序使用的所有内存将被释放。 (注意:实际上,您可以在 list 文件中设置参数,以使不同的线程在不同的Linux进程中运行,因此变得更加复杂。)
至少对于快速而肮脏的测试,如果您绝对需要知道线程实际上已完全退出,则kill过程会很好地完成它。但是,如果您正在运行多个线程,则可能必须从每个线程中杀死每个线程。
编辑:这是一个很好的链接,以阅读该主题:
http://developer.android.com/guide/components/fundamentals.html
它说明了每个应用程序如何在其自己的虚拟机中运行,以及每个虚拟机在其自己的用户ID下运行。
这是另一个很好的链接,用于解释应用程序及其所有线程如何(除非在 list 中另有说明)如何在单个Linux进程中运行:
http://developer.android.com/guide/components/processes-and-threads.html
因此,通常来说,应用程序实际上是在计算机上运行的程序,并且该应用程序确实可以被完全杀死,从而立即从内存中删除所有资源。
(我的意思是立即-很快就需要公羊。)
PS:有没有想过为什么您要接听Android手机或启动您喜欢的应用程序,并且冻结一秒钟?曾经因为厌倦而重新启动吗?这可能是因为您上周运行了所有应用程序,并认为您已退出,但仍在使用内存。当电话需要更多内存时,电话会杀死它们,从而导致您延迟要执行的任何操作!
适用于Android 4/Gingerbread的更新:除应用程序退出或崩溃并且其整个Java虚拟机进程死机之外,其他情况与上述相同,但它仍显示为在应用程序管理器中运行,并且您仍然具有“强制关闭”状态选项或其他内容。 4.0必须具有它认为正在运行的应用程序的独立列表,而不是实际检查应用程序是否真的在运行。