关闭Android应用程序

Close Android Application

本问题已经有最佳答案,请猛点这里访问。

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


是-为什么,然后如何(有点):好的。

简短回答:好的。

1
System.exit(0);

这很好,干净地终止了整个Java程序,它专门运行应用程序。但是,你应该从主活动开始,否则Android会自动重启你的应用程序。(在Android 7.0上测试过)好的。

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

我真的看不到对那些想终止他们的应用程序的人说粗话的好处。好的。

对于初学者来说,good是一个友好的提醒:在Android上,你不必担心关闭你的应用程序——但是有些人确实想终止他们的应用程序,即使他们知道他们不必这么做——而他们关于如何这样做的问题是一个有有效答案的合法问题。好的。

也许很多人生活在一个理想的世界里,却没有意识到现实世界里的人们都在努力解决现实问题。好的。

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

的确,谷歌的开发人员设计了一个系统,他们相信没有人需要退出他们的应用程序。也许99%的时候他们是对的!好的。

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

还有一个需要能够关闭一个程序,这是为了排除故障。这就是我进入这个话题的原因:我只是在学习如何利用音频输入功能来做实时DSP。好的。

现在别忘了我说过的话:我很清楚,当我把所有的事情都做好了,我就不需要杀死我的应用程序来重置音频接口了。好的。

但是:记住,完美的应用程序并不是从完美的应用程序开始的!他们开始只是一个勉强工作的应用程序,并成长为合适的理想应用程序。好的。

所以我发现我的小型音频示波器测试应用程序工作得很好,直到我按下Android主页按钮。当我重新启动我的示波器应用程序时,已经没有音频输入了。好的。

一开始我会去Settings->Applications->Manage Applications->AppName->Force Stop.好的。

(注意,如果实际的Linux进程没有运行,强制停止按钮将被禁用。如果启用了该按钮,则Linux进程仍在运行!)好的。

然后我可以重新启动我的应用程序,它又工作了。好的。

起初,我只是用除以零的方法来破坏它——这很有效。但我决定寻找一个更好的方法-这让我来到这里!好的。

以下是我尝试的方法和我发现的:好的。

背景:Android在Linux上运行。Linux有和Windows一样的进程和进程ID(PIDS),只有更好。要查看Android上运行的进程(连接到USB和所有东西),请运行adb shell top,您将获得在Android下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主页选项,我的应用程序就会继续运行。如果我使用Activity.finish(),它仍然会让进程继续运行。除以零肯定会终止正在运行的Linux进程。从应用程序中删除PID似乎是迄今为止我发现的最好的方法,至少是为了调试。好的。

我最初通过添加一个按钮来解决我的应用程序被除数为零的问题,就像在我的MainActivity.java中那样:好的。

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

然后在该按钮的布局XML文件部分中,我只设置了android:onclick="exit"。好的。

当然,被零除是混乱的,因为它总是显示"这个应用程序停止了…"或其他什么。好的。

然后我试着完成,就像这样:好的。

1
2
3
4
public void exit(View view)
{
    finish();
}

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

然后我试着:好的。

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

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

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

1
2
3
4
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。好的。

因此,一般来说,应用程序实际上是一个在计算机上运行的程序,应用程序确实可以被完全杀死,立即从内存中删除所有资源。好的。

(我的意思是尽快——不迟于需要RAM的时候。)好的。

附言:有没有想过为什么你要去接你的安卓手机或启动你最喜欢的应用程序,它会冻结一秒钟?有没有因为厌倦而重新启动?这可能是因为你上周运行的所有应用程序都认为你退出了,但仍在使用内存。当需要更多的内存时,手机会杀死他们,在你想做的任何操作之前都会造成延迟!好的。

更新Android 4 /姜饼:同样的事情适用于上述,除了当一个应用程序退出或崩溃,它的整个Java虚拟机进程死亡,它仍然表现为运行在应用程序管理器,你仍然有"强制关闭"选项或无论它是什么。4.0必须有一个它认为正在运行的应用程序的独立列表,而不是实际检查应用程序是否真的在运行。好的。好啊。


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


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


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

此代码终止操作系统中的进程使用此代码会干扰操作系统。所以我建议你使用下面的代码

1
2
3
4
5
this.finish();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

据我所知,完成功能仅关闭当前显示的屏幕。

请参阅这个例子(在这里看到由"plusMinus"给出的答案),它将帮助您关闭应用程序。


只需在要结束活动的方法中调用finish(),例如,当使用onCreate()方法时,在方法的末尾,只需添加finish()即可看到活动在创建后立即结束!


答案取决于你所说的"关闭应用程序"。在Android的术语中,它要么是关于一个"活动",要么是一组按时间/祖先顺序称为"任务"的活动。

结束活动:只需致电EDOCX1[1]

结束任务:

  • 清除活动任务堆栈
  • 导航到根活动
  • 然后调用finish on it。
  • 这将结束整个"任务"


    不是一行代码解决方案,但非常简单:

    子类活动,然后重写并将finish()添加到onpause()方法

    这样,一旦活动进入后台,它就会消失,因此应用程序不会保留一堆活动,您可以完成()当前活动,应用程序就消失了!


    在进行此操作之前,请阅读另一个问题:

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

    我认为你不能用一行代码来完成。尝试使用StartActivityForResult打开活动。因此,您可以传递类似关闭标记的内容,它将通知父活动其子活动已完成。

    也就是说,你应该读一下这个答案。


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


    这是初学者Android开发人员最无用的愿望之一,不幸的是,它似乎非常流行。如何定义"关闭"Android应用程序?隐藏它的用户界面?中断后台工作?停止处理广播?

    android应用程序是一组模块,捆绑在.apk中,通过androidmanifest.xml暴露在系统中。活动可以通过不同的任务堆栈来安排和重新安排,而finish()-ing或任何其他远离单个活动的操作在不同的情况下可能意味着完全不同的事情。单个应用程序可以在多个进程内运行,因此杀死一个进程并不意味着不需要运行任何应用程序代码。最后,系统可以随时调用广播接收器,如果不运行,则重新创建所需的进程。

    最重要的是,你不需要通过一行代码来停止/杀死/关闭/任何你的应用程序。这样做表明您错过了Android开发中的一些重要要点。如果出于某种奇怪的原因,您必须完成()所有活动,停止所有服务并禁用在androidmanifest.xml中声明的所有广播接收器。这不是一行代码,也许启动卸载您自己的应用程序的活动可以更好地完成这项工作。