关闭Android应用程序

Ami*_*mit 34 android

请建议我如何使用一行代码关闭整个Android应用程序.

Jes*_*don 82

是的 - 为什么,然后如何(某种程度):

简短回答:

System.exit(0);
Run Code Online (Sandbox Code Playgroud)

这很好地干净地终止了专用于运行应用程序的整个java机器.但是,您应该从主活动中执行此操作,否则android可能会自动重启您的应用程序.(在Android 7.0上测试过)

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

我真的没有看到那些正在寻找终止他们的应用程序的人严厉说话的好处.

好的是对初学者的友好提醒,在Android上你不必担心关闭你的应用程序 - 但有些人确实想要终止他们的应用程序,即使他们知道他们不需要 - 以及他们的问题怎么做是一个有效答案的合理问题.

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

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

确实,谷歌的开发人员设计了一个系统,他们认为没有人需要退出他们的应用程序.也许99%的时间他们是对的!

但是允许数百万程序员为平台编写代码的一个令人惊奇的事情是,他们中的一些人会试图将平台推向极限,以便做出惊人的事情! - 包括Android开发者从未梦想过的东西!

能够关闭程序还有另一个需要,那就是用于故障排除.这就是我接受这个主题的原因:我正在学习如何利用音频输入功能来实现实时DSP.

现在不要忘记我说了以下内容:我知道当我完成所有工作时,我不需要杀死我的应用来重置音频接口.

但是:请记住,完美的应用程序并不是最完美的应用程序!他们最初只是勉强工作的应用程序,并成长为适当的理想应用程序.

所以我发现我的小音频示波器测试应用程序运行良好,直到我按下Android主页按钮.当我重新启动示波器应用程序时,再也没有音频了.

起初我会进去 Settings->Applications->Manage Applications->AppName->Force Stop.

(注意,如果实际的linux进程没有运行,Force Stop按钮将被禁用.如果启用该按钮,则Linux进程仍在运行!)

然后我可以重新启动我的应用程序,它再次工作.

起初,我只是使用除以零来使其崩溃 - 这很有效.但我决定寻找一种更好的方式 - 让我来到这里!

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

背景:Android在Linux上运行.Linux具有与Windows一样的进程和进程ID(PID),只是更好.要查看你的android上运行的进程(连接到USB和所有内容)运行adb shell top,你将获得在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;
}
Run Code Online (Sandbox Code Playgroud)

然后在我的布局XML文件部分,我只是设置了android:onClick ="exit".

当然,除以零是混乱的,因为它总是显示"此应用程序停止..."或其他什么.

那么我尝试了完成,像这样:

public void exit(View view)
{
    finish();
}
Run Code Online (Sandbox Code Playgroud)

这使得应用程序从屏幕上消失,但它仍然在后台运行.

然后我尝试了:

public void exit(View view)
{
      android.os.Process.killProcess(android.os.Process.myPid());
}
Run Code Online (Sandbox Code Playgroud)

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

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

public void exit(View view)
{
      System.exit(0);
}
Run Code Online (Sandbox Code Playgroud)

它立刻完成了有问题的线程的完全退出,而没有告诉用户应用程序崩溃了.

应用程序使用的所有内存都将被释放.(注意:实际上,您可以在清单文件中设置参数,以使不同的线程在不同的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必须有一个它认为正在运行的应用程序的独立列表,而不是实际检查应用程序是否真的在运行.

  • 嘿,你在这里没有多少分,但我想对这个长而有用的答案表示感谢."你不需要这样做"(目前最好的答案)或多或少没有进一步的解释.你的答案实际上解释了我所需要的. (3认同)

Rof*_*ion 11

您可以通过调用Activity.finish()来完成您的Activity .但是要注意Android Activity的生命周期.

  • 这是一个电话. (4认同)