关闭Android应用程序

时间:2010-07-19 08:50:10

标签: android

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

12 个答案:

答案 0 :(得分:80)

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

简短回答:

System.exit(0);

这很好地干净地终止了专用于运行应用程序的整个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下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 ="退出"。

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

然后我尝试了完成,就像这样:

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虚拟机进程终止,它仍显示为在应用程序管理器中运行,并且您仍然拥有& #34;强行关闭"选项或其他任何东西。 4.0必须有一个它认为正在运行的应用程序的独立列表,而不是实际检查应用程序是否真的在运行。

答案 1 :(得分:11)

您可以致电Activity.finish()完成活动。但请注意Android Activity life-cycle

答案 2 :(得分:4)

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

答案 3 :(得分:2)

只需在你想要结束活动的方法中调用finish(),例如当你使用onCreate()方法时,在方法的最后,只需添加finish(),你就会看到活动它一旦创建就结束了!

答案 4 :(得分:2)

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

请参阅此example (请参阅'plusminus'给出的答案),它一定会帮助您关闭应用程序。

答案 5 :(得分: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);

答案 6 :(得分:1)

在此之前,请阅读其他question

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

答案 7 :(得分:1)

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

子类Activity,然后覆盖并将finish()添加到onPause()方法

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

答案 8 :(得分:1)

答案取决于“关闭应用”的含义。在android的术语中,它是关于“活动”,或称为“任务”的时间/祖先顺序中的一组活动。

结束活动:只需致电finish()

结束任务:

  1. 清除活动任务堆栈
  2. 导航到根活动
  3. 然后打电话给它。
  4. 这将结束整个“任务”

答案 9 :(得分:0)

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

答案 10 :(得分:0)

我认为你不能在一行代码中做到这一点。尝试使用startActivityForResult打开您的活动。因此,您可以传递类似CLOSE_FLAG的内容,这将通知您的父活动其子活动已完成。

那就是说,你应该阅读this answer

答案 11 :(得分:-2)

这是初学Android开发者最无用的欲望之一,不幸的是它似乎非常受欢迎。你如何定义“关闭”Android应用程序?隐藏它的用户界面?中断后台工作?停止处理广播?

Android应用程序是一组模块,捆绑在.apk中,并通过AndroidManifest.xml暴露给系统。可以通过不同的任务堆栈来安排和重新安排活动,并且完成()或任何其他导航远离单个活动可能意味着在不同情况下完全不同的事物。单个应用程序可以在多个进程内运行,因此杀死一个进程并不一定意味着不会运行任何应用程序代码。最后,系统可以随时调用BroadcastReceivers,如果它们没有运行,则重新创建所需的进程。

主要的是你不需要通过一行代码停止/终止/关闭/关闭你的应用程序。这样做表明您错过了Android开发中的一些重要观点。如果由于某些奇怪的原因你必须这样做,你需要完成()所有活动,停止所有服务并禁用AndroidManifest.xml中声明的所有BroadcastReceivers。这不是一行代码,并且可能启动卸载您自己的应用程序的Activity将更好地完成工作。