关闭 Android 应用程序 [重复]

Posted

技术标签:

【中文标题】关闭 Android 应用程序 [重复]【英文标题】:Close Android Application [duplicate] 【发布时间】:2011-03-17 19:30:56 【问题描述】:

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

【问题讨论】:

你为什么要规定它必须在一行代码中?它很可能需要更多的时间。 【参考方案1】:

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

简答:

System.exit(0);

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

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

我真的不认为对正在寻找终止其应用程序的方法的人说粗话有什么好处。

Good 是对初学者的友好提醒,在 Android 上您不必担心关闭应用程序 - 但有些人实际上确实想终止他们的应用程序,即使他们知道他们不必这样做 - 并且他们如何做到这一点的问题是一个合法的问题,并且有一个有效的答案。

也许很多人生活在一个理想的世界中,却没有意识到有一个真实的世界,真实的人正在努力解决真实的问题。

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

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

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

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

现在不要忘记我说过以下话:我很清楚,当我把所有事情都做好后,我就不需要杀死我的应用程序来重置音频界面。

但是:请记住,完美的应用程序并非一开始就是完美的应用程序!它们一开始只是勉强工作的应用程序,然后发展成为合适的理想应用程序。

所以我发现我的小型音频示波器测试应用程序运行良好,直到我按下 android Home 按钮。然后,当我重新启动我的示波器应用程序时,再也没有音频进来了。

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

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

然后我可以重新启动我的应用程序并再次运行。

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

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

背景: Android 在 Linux 上运行。 Linux 有进程和进程 ID (PID),就像 Windows 一样,只是更好。 运行adb shell top查看你的android上正在运行的进程(它连接到USB和所有东西),你会得到一个在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="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);

它会立即很好地完全退出有问题的线程,而不会告诉用户应用程序崩溃了。

应用程序使用的所有内存都将被释放。 (注:其实你可以在你的manifest文件中设置参数,让不同的线程在不同的Linux进程中运行,那就更复杂了。)

至少对于快速而肮脏的测试,如果您绝对需要知道线程实际上已完全退出,那么 kill 进程可以很好地完成。但是,如果您正在运行多个线程,则可能必须从每个线程中杀死每个线程。

编辑:这是一个很好的阅读链接: http://developer.android.com/guide/components/fundamentals.html 它解释了每个应用程序如何在自己的虚拟机中运行,以及每个虚拟机在自己的用户 ID 下运行。

这是另一个很好的链接,它解释了(除非在清单中另有说明)应用程序及其所有线程如何在单个 Linux 进程中运行:http://developer.android.com/guide/components/processes-and-threads.html

所以作为一般规则,应用程序确实是在计算机上运行的程序,并且该应用程序确实可以被完全杀死,立即从内存中删除所有资源。

(我的意思是尽快——不是以后需要 ram 的时候。)

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

Android 4/Gingerbread 的更新:与上述相同,但即使应用退出或崩溃并且其整个 Java 虚拟机进程终止,它仍会在应用管理器中显示为正在运行,并且您仍然拥有“强制关闭”选项或其他任何选项。 4.0 必须有一个它认为正在运行的应用程序的独立列表,而不是实际检查应用程序是否真的在运行。

【讨论】:

嘿,您在这里没有太多要点,但我想对这个冗长而有用的回答表示感谢。 “你不需要这样做”(目前是最佳答案)在没有进一步解释的情况下或多或少是无用的。你的回答实际上解释了我需要什么。 不需要任何花哨的代码,只需尝试System.exit(0) 退出Android 应用程序。这基本上是 Android 支持/移植的 Java 命令。毕竟,Android 基本上是 Java 加上一些其他的东西。 :) 是的!谢谢! System.exit(0) 绝对是最好的方法。在发现 System.exit() 之前,我已经编写了上述大部分内容,但我留下它是为了帮助人们更好地了解情况。谢谢! @JesseGordon:我有同样的要求来杀死应用程序。我使用 System.exit(0) 并且它有效。虽然有时我会收到崩溃对话框-'不幸的是 已停止'(我不想来)。我怎样才能防止/避免该对话框。'kill process'的功能是否与 System.exit(0) 相同? @Basher51:这是一个有趣的问题。如果应用程序执行某种违规行为,而不是使用 System.exit(0) 干净地退出,我只会期望“不幸......”消息......我的猜测是,也许你有另一个导致的代码问题违规,例如将整数除以零或其他内容。尝试通过 Eclipse 中的调试器运行应用程序,以便在应用程序退出时查看错误消息详细信息。对不起,我没有什么更有用的了! 〜杰西【参考方案2】:

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

【讨论】:

我希望整个活动都通过一个电话完成 是的,但它只关闭一个活动,而不是属于应用程序的所有活动。 finish() 仅关闭该活动,但保留其他所有内容和 java 虚拟机运行。 system.exit(0) 关闭整个应用程序。 有没有办法关闭应用程序本身,而只是关闭活动? 好电话。它对于单活动应用程序很有用。谢谢。【参考方案3】:

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

【讨论】:

这是正确的。每个应用程序都在其自己的 Java 虚拟机中运行,这是一个 Linux 进程/任务。 System.exit(0) 终止正在运行该应用程序的 Java 虚拟机,并完全关闭它。否则,JVM 和应用程序将在内存中停留数天或数周。 这应该是第一个答案。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

参考这个example (在哪里看到'plusminus'给出的答案),它肯定会帮助你关闭你的应用程序。

【讨论】:

【参考方案6】:

在这样做之前,请阅读其他question:

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

【讨论】:

【参考方案7】:
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);

【讨论】:

【参考方案8】:

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

结束活动:拨打finish()

结束任务:

    清除活动任务堆栈 导航到根活动 然后调用finish就可以了。

这将结束整个“任务”

【讨论】:

【参考方案9】:

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

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

这样,activity一进入后台就会消失,因此app不会保留一堆activity,你可以finish()当前activity,app就消失了!

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

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

也就是说,您可能应该阅读this answer。

【讨论】:

system.exit(0) 在一行代码中做得非常好。杀死专门用于运行该应用程序的整个 JVM。【参考方案12】:

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

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

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

【讨论】:

我不认为这是一个有用的答案。他没有征求你的意见(这并不完全正确)。您需要执行此操作的一个示例是,如果您有一个未捕获异常处理程序,该处理程序将异常发送到 Web 服务器,然后在通知用户必须执行的操作后关闭应用程序。 这不是无用的愿望。如果finished() 应用程序实际上没有关闭,Android 会使它们在内存中停留数周或数天,从而耗尽内存。通常,每个应用程序完全在其自己的 java 虚拟机中运行,这是一个 Linux 进程,在其自己的用户 ID 下运行。当 JVM 死掉时,应用程序 100% 关闭。 System.exit(0) 终止 JVM 和应用程序。 Activity.finish() 不会完全关闭应用程序,而是让它和它的 JVM 在内存中运行。 每个应用程序完全在它自己的进程中运行是不正确的 - 每个应用程序至少在一个进程中运行,但可能有更多。一旦 UI 消失,Android 操作系统不会立即释放应用程序的内存,原因有很多。在您的编程中采用此类方法之前,您只需要升级您的 Android 知识:developer.android.com/guide/components/… ognian,另外,您提到 Android 有几个很好的理由不释放应用程序的资源。然而,更准确的说法是,某些类型的应用程序在保持加载状态时确实会提供更好的用户体验,而对于那些应用程序来说,有理由让它们保持加载状态。但是,有些应用程序不需要保持加载。没有任何理由占用我上周运行但不会运行一个月的应用程序的内存!当我启动我想运行的应用程序时,我希望它启动 - 无需等待 Android 最终关闭我在过去 30 天内使用过的所有应用程序! @ognian :不,分配给一个 Linux 进程使用的内存根本不能被另一个 Linux 进程使用,直到第一个进程完全关闭。如果你 ssh 进入你的 android 设备并运行 top,你可以看到每个应用程序,无论是前台还是后台,都在使用如此多的内存。直到请求 Android 应用程序执行其关闭序列(如果有)并自行关闭后,该内存才“可用”。而这一切都需要时间。因此,当您启动一个应用程序时,如果必须先杀死其他应用程序,您将不得不等待更长的时间才能启动它。

以上是关于关闭 Android 应用程序 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

应用程序在将项目添加到列表视图(android)时强制关闭[重复]

Android:调用 Activity 时应用程序关闭。意图,上下文,字符串[重复]

Android Studio - 如何(关闭,退出,退出,杀死等)应用程序[重复]

Android GCM:通知关闭后重复推送

从 Android gcm 服务器接收重复的推送通知 [关闭]

如何在Android中强制停止AsyncTask [重复]