【发布时间】:2011-03-17 19:30:56
【问题描述】:
请建议我如何用一行代码关闭整个 Android 应用程序。
【问题讨论】:
-
你为什么要规定它必须在一行代码中?它很可能需要更多的时间。
标签: android
请建议我如何用一行代码关闭整个 Android 应用程序。
【问题讨论】:
标签: android
是的 - 为什么,然后如何(有点):
简答:
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 加上一些其他的东西。 :)
您可以致电Activity.finish() 完成您的活动。但是请注意Android Activity life-cycle。
【讨论】:
您可以通过调用 System.exit(0) 来关闭您的 Android 应用程序。
【讨论】:
只需在你想结束活动的方法中调用finish(),例如当你使用onCreate()方法时,在方法的最后,只需添加finish(),你就会看到活动一创建就结束!
【讨论】:
据我所知,完成功能只关闭当前显示的屏幕。
参考这个example (在哪里看到'plusminus'给出的答案),它肯定会帮助你关闭你的应用程序。
【讨论】:
在这样做之前,请阅读其他question:
android.os.Process.killProcess(android.os.Process.myPid());
【讨论】:
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);
【讨论】:
答案取决于您所说的“关闭应用程序”是什么意思。在 android 的术语中,它要么是关于一个“活动”,要么是一组按时间/祖先顺序称为“任务”的活动。
结束活动:拨打finish()
结束任务:
这将结束整个“任务”
【讨论】:
不是单行代码解决方案,但非常简单:
子类Activity,然后覆盖并添加finish()到onPause()方法
这样,activity一进入后台就会消失,因此app不会保留一堆activity,你可以finish()当前activity,app就消失了!
【讨论】:
如果你使用Activity.finish()关闭主Activity,我认为它会关闭所有的Activity。
也许你可以覆盖默认函数,并以静态方式实现它,我不确定
【讨论】:
我认为你不能在一行代码中做到这一点。尝试使用 startActivityForResult 打开您的活动。结果,您可以传递类似 CLOSE_FLAG 的内容,它会通知您的父 Activity 其子 Activity 已完成。
也就是说,您可能应该阅读this answer。
【讨论】:
这是初学者 Android 开发人员最无用的愿望之一,不幸的是,它似乎很受欢迎。您如何定义“关闭”Android 应用程序?隐藏它的用户界面?中断后台工作?停止处理广播?
Android 应用程序是一组模块,捆绑在 .apk 中并通过 AndroidManifest.xml 向系统公开。活动可以通过不同的任务堆栈进行安排和重新安排,并且完成()-ing或任何其他离开单个活动的导航可能在不同情况下意味着完全不同的事情。单个应用程序可以在多个进程中运行,因此杀死一个进程并不意味着没有应用程序代码继续运行。最后,系统可以随时调用 BroadcastReceiver,如果它们没有运行,则重新创建所需的进程。
主要是您不需要通过一行代码停止/杀死/关闭/无论您的应用程序如何。这样做表明你错过了 Android 开发中的一些重要点。如果出于某种奇怪的原因您必须这样做,您需要完成()所有活动,停止所有服务并禁用 AndroidManifest.xml 中声明的所有广播接收器。这不是一行代码,也许启动卸载您自己的应用程序的 Activity 会做得更好。
【讨论】: