closuresAndroid应用程序

请build议我如何用一个行代码closures我的整个Android应用程序。

Solutions Collecting From Web of "closuresAndroid应用程序"

是的 – 为什么,那么(如何):

简短的回答:

System.exit(0); 

这很好,干净地终止整个java机器,专门运行应用程序。 但是,你应该从主要活动,否则Android可能会自动重新启动您的应用程序。 (在Android 7.0上testing了这个)

为什么这是一个很好的问题和程序员的细节和解释可能有一个非常合理的理由来这样终止他们的应用程序:

对于正在寻找终止应用的方式的人来说,我真的没有看到好处。

好的是对初学者友好的提醒,在Android上你不必担心closures你的应用程序 – 但是有些人确实想要终止他们的应用程序,即使他们知道他们不需要 – 而且他们的问题如何这样做是一个有效答案的合法问题。

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

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

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

但让数百万程序员为平台编写代码的令人惊奇的事情之一是,其中一些人会试图将平台推到极限,以做出惊人的事情! – 包括Android开发者从未梦寐以求的东西!

还有一个需要能够closures程序,这是为了解决问题的目的。 那是什么使我对这个线程:我只是在学习如何利用audioinputfunction做实时DSP。

现在不要忘了我说了以下几点:我知道,当我把所有事情都做好的时候,我不需要杀掉我的应用程序来重置audio接口。

但是:请记住,完美的应用程序并不像完美的应用程序开始! 他们刚开始只是几乎没有工作的应用程序,并成长为适当的理想的应用程序。

所以我发现我的小audio示波器testing应用程序工作得很好,直到我按下了Android主页button。 当我重新启动示波器应用程序时,再也没有audio了。

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

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

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

起初,我只是用零分之一来崩溃,而且效果很好。 但是我决定寻找一个更好的方式 – 将我降落在这里!

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

背景:Android在Linux上运行。 Linux像Windows一样拥有进程和进程ID(PID),只有更好。 看看你的android上运行着什么进程(连接到USB和所有东西),运行adb shell top ,你将得到一个在android下运行在linux下的所有进程的更新列表。

如果你的电脑上也有linux,你可以input

adb shell top | egrep -i '(User|PID|MyFirstApp)' --line-buffered

只获取名为MyFirstApp的应用程序的结果。 你可以看到在这个名字下运行了多less个Linux进程,以及它们消耗了多lessCPU的能力。

(像Windows中的任务pipe理器/进程列表)

或者,如果你只想看到正在运行的应用程序:

adb shell top | egrep -i '(User|PID|app_)' --line-buffered

您也可以通过运行adb shell kill 12345设备上的任何应用程序,其中12345是PID号码。

从我所知道的,每个单线程应用程序只使用一个Linux进程。

所以我发现(当然),如果我只是激活Android主页选项,我的应用程序继续运行。 如果我使用Activity.finish() ,它仍然会使进程运行。 除零绝对终止正在运行的linux进程。 从应用程序中杀死PID似乎是迄今为止最好的,至less出于debugging的目的。

我最初解决了我的需要,通过添加一个button来除去我的应用程序,就像在我的MainActivity.java

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

然后在我的布局XML文件部分的button,我只是设置android:onClick =“退出”。

当然除以零是凌乱的,因为它总是显示“这个应用程序停止…”或其他。

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

 public void exit(View view) { finish(); } 

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

然后我试着:

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

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

更新:这是相同的,因为它立即终止了Linux进程和应用程序的所有线程:

 public void exit(View view) { System.exit(0); } 

它立即做了一个很好的线程完全退出,而不告诉用户该应用程序崩溃。

应用程序使用的所有内存将被释放。 (注意:实际上,您可以在清单文件中设置参数,以使不同的线程在不同的Linux进程中运行,所以它变得更加复杂。)

至less对于快速和肮脏的testing来说,如果你绝对需要知道线程实际上已经完全退出,那么kill过程可以很好地完成。 但是,如果您正在运行多个线程,则可能必须杀死每个线程中的每个线程。

编辑:这是一个伟大的链接阅读的主题: http://developer.android.com/guide/components/fundamentals.html : http://developer.android.com/guide/components/fundamentals.html它解释了每个应用程序运行在自己的虚拟机,每个虚拟机运行在自己的用户名。

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

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

(即刻我的意思是尽快 – 不要晚些时候需要内存。)

PS:有没有想过为什么你去回答你的android手机或启动你最喜欢的应用程序,它冻结了一秒? 重新开机,因为你厌倦了吗? 这可能是因为你上周运行的所有应用程序,并认为你已经退出,但仍然在使用内存。 手机在需要更多内存时会杀死他们,导致在您想要做的任何动作之前造成延迟!

更新为Android 4 /姜饼:同样的事情适用,除了即使应用程序退出或崩溃,其整个Java虚拟机进程死亡,它仍然显示为运行在应用程序pipe理器,你仍然有“逼近”选项或任何它是。 4.0必须有一个它认为正在运行的应用程序的独立列表,而不是实际检查应用程序是否真的在运行。

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

你可以通过调用System.exit(0)closures你的Android应用程序。

只需在要结束活动的方法中调用finish()方法,例如在使用onCreate()方法时,在方法的末尾添加finish(),您将看到活动尽快结束因为它被创造!

据我所知,完成function只closures当前显示的屏幕。

参考这个例子 (看看'plusminus'给出的答案),它肯定会帮助你closures你的应用程序。

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

此代码杀死从OS的进程使用此代码干扰操作系统。 所以我build议你使用下面的代码

 this.finish(); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); 

在这之前,请先阅读这个问题 :

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

不是一个单行代码的解决scheme,但很容易:

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

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

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

我不认为你可以在一行代码中做到这一点。 尝试用startActivityForResult打开您的活动。 结果你可以传递一个CLOSE_FLAG,这会告诉你的父级活动它的子活动已经完成。

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

答案取决于你的意思是“亲密的应用程序”。 在android的术语中,它要么是一个“活动”,要么是一个被称为“任务”的时间/祖先顺序的一组活动。

结束活动:只需调用finish()

结束任务:

  1. 清除活动任务堆栈
  2. 导航到根活动
  3. 然后打电话给它完成。

这将结束整个“任务”

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

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

主要的是你不需要通过一行代码来停止/杀死/closures/你的应用程序。 这样做表示您错过了Android开发中的一些重要点。 如果出于某种奇怪的原因必须这样做,则需要完成()所有活动,停止所有服务并禁用AndroidManifest.xml中声明的所有BroadcastReceivers。 这不是一行代码,也许启动卸载你自己的应用程序的活动会更好地完成这项工作。