继续尝试学习Android,我只是read the following:
问题:用户是否可以选择终止该应用程序 除非我们放一个菜单选项来杀死它?如果不存在此类选项, 用户如何终止申请? 的
答案:(Romain Guy):用户没有,系统会自动处理。这就是活动生命周期(特别是onPause / onStop / onDestroy)的用途。无论你做什么,都不要放“退出”或“退出”应用程序按钮。它与Android的应用程序模型无关。这也与核心应用程序的工作方式相反。 的
呵呵,我在Android世界中采取的每一步都遇到了某种问题=(
显然,您无法在Android中退出应用程序(但Android系统可以很好地完全破坏您的应用程序)。那是怎么回事?我开始认为编写一个充当“普通应用程序”的应用程序是不可能的 - 用户可以在他/她决定这样做时退出应用程序。这不应该依赖操作系统来做。
我尝试创建的应用程序不是Android Market的应用程序。它不是一般公众“广泛使用”的应用程序,它是一个商业应用程序,将用于非常狭窄的业务领域。
我真的很期待为Android平台开发,因为它解决了Windows Mobile和.NET中存在的很多问题。然而,上周对我来说有点懈怠...我希望我不必放弃Android,但它现在看起来不太好=(
我有办法真的退出申请吗?
答案 0 :(得分:1249)
答案 1 :(得分:288)
我想在此处为此线程的未来读者添加更正。这种特殊的细微差别已经逃脱了我的理解很长一段时间,所以我想确保你们没有人犯同样的错误:
如果您在堆栈中有多个活动,则 System.exit()
不会终止您的应用。实际发生的是该进程被终止并立即重新启动在堆栈上减少一个活动。这也是当您的应用程序被“强制关闭”对话框杀死时,甚至当您尝试从DDMS终止该进程时发生的情况。据我所知,这是一个完全无证的事实。
简短的回答是,如果你想要退出你的应用程序,你必须跟踪你的堆栈中的所有活动,并且当用户想要退出时,finish()
所有这些活动(不,有没办法遍历Activity堆栈,所以你必须自己管理所有这些)。即使这实际上并没有杀死你可能拥有的过程或任何悬空参考。它只是完成了活动。另外,我不确定Process.killProcess(Process.myPid())
是否更好;我还没有测试过。
另一方面,如果您可以在堆栈中保留活动,那么还有另一种方法可以使您的工作变得非常简单:Activity.moveTaskToBack(true)
将只显示您的流程并显示主屏幕
长篇答案涉及对这种行为背后的哲学的解释。哲学源于许多假设:
onSaveInstanceState
期间有效地序列化,但是whaddya会做什么?)对于大多数编写得很好的Android应用程序这应该是真的,因为你永远不知道你的应用何时会在后台被杀掉。当您考虑它时,这适用于该平台。首先,这正是当进程在后台被杀死并且用户返回它时发生的情况,因此需要在它停止的地方重新启动它。其次,当应用程序崩溃并出现可怕的Force Close对话框时会发生这种情况。
说我希望我的用户能够拍照并上传。我从我的活动中启动了Camera Activity,并要求它返回一张图片。 Camera被推到我当前Task的顶部(而不是在自己的Task中创建)。如果相机出现错误并且崩溃,是否会导致整个应用程序崩溃?从用户的角度来看,只有相机失败,应该将它们返回到之前的活动。所以它只是重新启动进程,堆栈中的所有相同活动,减去相机。由于您的活动应该设计为可以随时杀死和恢复它们,这应该不是问题。不幸的是,并非所有的应用程序都可以这样设计,因此无论Romain Guy或其他任何人告诉您,我们很多人都是的问题。因此,我们需要使用变通方法。
所以,我的结论是:
finish()
或致电moveTaskToBack(true)
。startActivity()
标记的Intent调用Intent.FLAG_ACTIVITY_CLEAR_TOP
。答案 2 :(得分:174)
我的所有应用程序都已退出按钮......我经常因此而得到用户的积极评价。我不关心平台是否以应用程序不需要它们的方式设计。说“不要把它们放在那里”有点荒谬。如果用户想要退出...我向他们提供了完全相同的访问权限。我认为它根本不会减少Android的运行方式,这似乎是一种很好的做法。我理解生命周期......我的观察是Android在处理它方面做得不好....这是一个基本事实。
答案 3 :(得分:141)
不要将您的应用程序视为单一应用程序。它是一组用户可以与您的“应用程序”交互的UI屏幕,以及通过Android服务提供的“功能”。
不知道你的神秘应用“做什么”并不重要。让我们假设它隧道进入一些超级安全的企业内部网,执行一些监控或交互,并保持登录状态,直到用户“退出应用程序”。由于您的IT部门会命令它,因此用户必须非常清楚Intranet的IN或OUT。因此,您的心态对于用户“退出”非常重要。
这很简单。制作一项服务,在通知栏中发出持续通知,说“我在内联网,或者我正在运行”。让该服务执行您的应用程序所需的所有功能。拥有绑定到该服务的活动,以允许您的用户访问他们与您的“应用程序”交互所需的UI。并拥有一个Android菜单 - >退出(或注销,或其他)按钮,告诉服务退出,然后关闭活动本身。
对于所有意图和目的,这正是你想要的。完成Android方式。查看Google Talk或Google Maps Navigation,了解这种“退出”的可能性。唯一的区别是,在您的活动中按下后退按钮可能会让您的UNIX进程处于等待状态,以防用户想要恢复您的应用程序。这与在内存中缓存最近访问的文件的现代操作系统没有什么不同。退出Windows程序后,很可能它所需的资源仍在内存中,等待被其他资源替换,因为它们已被加载,因为它们已不再需要。 Android也是一样。
我真的没有看到你的问题。
答案 4 :(得分:70)
这是一个有趣且富有洞察力的讨论,有很多专家参与。我认为这篇文章应该从Android开发主网站中回放,因为它确实围绕着Android操作系统的核心设计之一。
我还想在这里加两分钱。
到目前为止,我对Android处理生命周期事件的方式印象深刻,为本机应用程序带来了类似Web的体验概念。
话虽如此,我仍然相信应该有一个 Quit 按钮。为什么? ......不适合我或泰德或任何技术专家,但仅限于满足最终用户的需求。
虽然我不是Windows的忠实粉丝,但很久以前他们引入了大多数最终用户习惯的概念(一个X按钮)......“我想在'我想'时退出运行一个小部件”
这并不意味着有人(操作系统,开发人员?)会根据自己的判断来处理这个问题......它只是意味着“我习惯的红色X按钮在哪里”。我的动作类似于“按下按钮时结束通话”,“按下按钮关闭设备”等等......这是一种感知。我的行动确实达到了目的,这本身就令人满意。
即使开发人员可以使用此处给出的建议来欺骗这种行为,但仍然存在这样的感觉,即应用程序应该完全停止(最近)由最终用户按需提供的独立,可信和中立的源(OS)运行。
答案 5 :(得分:35)
您可以退出,方法是按返回按钮或在finish()
中调用Activity
。如果你想明确地将其删除,只需从finish()
拨打MenuItem
。
Romain并不是说它无法完成,只是没有意义 - 用户不需要关心放弃或保存他们的工作或其他任何事情,因为应用程序生命周期的工作方式鼓励您编写智能软件无论发生什么,都会自动保存并恢复其状态。
答案 6 :(得分:31)
这场辩论归结为一个古老的问题,即开发者是否最了解或者用户是否最了解。人类因素的各个领域的专业设计师每天都在努力解决这个问题。
Ted指出,市场上下载次数最多的应用之一是“App Killer”。当人们退出申请时,人们会获得一些额外的血清素。他们已经习惯了桌面/笔记本电脑。它可以让事情快速发展。它可以使处理器保持冷却并且风扇不会打开。它耗电量更少。
如果您认为移动设备是一个小得多的船,那么您可以特别欣赏他们“过度抛弃您不再需要的东西”的动机。现在Android的开发人员已经推断出操作系统最了解并且退出应用程序是古董。我全心全意地支持这一点。
然而,我也相信你不应该挫败用户,即使这种挫败感是出于他们自己的无知。因此,我得出结论,“退出”选项是一个很好的设计,即使它主要是安慰剂按钮,只能关闭视图。
答案 7 :(得分:29)
我建议您阅读活动和服务。停止使用术语“app”并开始引用组件,即Activity,Service。我想您只需要了解有关Android平台的更多信息;它是标准PC应用程序的思维方式的变化。事实上,你的帖子中没有任何帖子中含有“活动”(缺少常见问题引用,即不是你的话),这告诉我你需要阅读更多内容。
答案 8 :(得分:23)
博客帖子 When to Include an Exit Button in Android Apps (Hint: Never) 解释得很远,远比我更好。我希望每个Android开发人员都已经阅读过它。
<强>摘录:强>
根据我的经验,[用户]真正想要的是: 确保应用程序停止消耗资源(电池,CPU周期,数据传输等)的明确方法。
许多用户认为退出按钮实现了此要求 并要求添加它。开发人员,希望取悦他们的用户, 有意添加一个。此后不久,他们都失败了。
- 在大多数情况下,退出按钮只会调用
Activity.finish()
。这完全等同于点击后退按钮。 完全正确。服务继续运行并且轮询不断发生。用户可能会认为他们已经杀了应用程序,但很快就没有 他们会更加生气。- 退出行为现在不明确。您的退出按钮是应该关闭活动,还是应该还停止所有关联的服务,接收器和警报?应该返回做什么?如果他们点击 Home 会发生什么?如果您的应用有小部件,会发生什么?退出按钮是否应该停止更新?
解决方案是让后退按钮按照您的预期运行 退出按钮。更好的是,只需停止消耗资源 该应用程序不可见。
继续阅读完整的文章。
答案 9 :(得分:20)
答案:(Romain Guy):用户没有,系统会处理这个问题 自动。这就是活动生命周期(特别是 onPause / onStop / onDestroy)用于。无论你做什么,都不要放一个 “退出”或“退出”应用程序按钮。 对于Android来说没用 应用模型。这也与核心应用程序的方式相悖 工作强>
1:完全退出申请可能通常是无意义的,但它并非毫无用处。如果Windows没有退出选项怎么办?当内存已满并且操作系统不得不猜测你完成了哪些程序时,系统会很慢。我不在乎Romain Guy甚至是Larry Page和Sergey Brin所说的 - 这些都是不容置疑的事实:系统运行速度较慢,因为他们必须先杀死任务才能在启动新应用之前获取内存。你不能告诉我,杀死一个应用程序并不需要时间!即使来自遥远星球的光也需要时间...... 一些用于允许用户完全关闭应用程序。
2:与核心应用程序的工作方式相反?那是什么意思?当我现在运行一个应用程序时,它已经不再做任何工作......它只是等待操作系统在需要内存时被杀死。
总之,在最小化和退出之间存在明显的差异,并且对于另一个而言,捏合都不会很好。我们是否在每个螺丝上留下螺丝刀?或者每扇门都有钥匙?我们是否将所有设备都置于高位,直到断路器爆炸并且我们需要打开另一台设备?我们是否将洗碗机放在盘子里,每次只取出足够的空间来为一些新的脏衣服腾出空间?我们是否让所有车辆都在车道上行驶,直到 - 哦,没关系。
如果用户想要最小化应用,那么最好的办法就是尽量减少它。如果用户想要退出应用,那么无论如何最好退出。
它皱起了眉头?这是Android的观点 - 他们对此不以为然。很多独立的新手Android开发者对此赞不绝口。
但是当它出现时,它有良好的编码和糟糕的编码。有很好的程序流模型,并且有不良的程序流模型。
当用户知道他们已完成程序时,将程序留在内存中并不是一个好的程序流程。它完全没有任何意义,在启动新应用程序或运行应用程序分配更多内存时会降低速度。
它有点像你的车:有时候你会让它继续运行,比如在停车灯处停车,或者快餐开车,或停在自动取款机上。但是在其他情况下你确实想把它关掉 - 就像你上班,杂货店甚至家里一样。
同样,如果你正在玩游戏并且手机响了,是的。暂停游戏并保持运行。但是如果用户已完成游戏一段时间,那么一定要让他们退出。
某些应用程序的退出按钮应该比其他应用程序更加突出。例如,游戏或用户可能想要完全退出的程序应该有明显的退出。其他程序,比如,可能是电子邮件程序,退出是不太可能的愿望(这样它可以继续检查电子邮件) - 这些程序不应该浪费主要控制输入屏幕空间的退出选项,但为了良好的程序流程,它应该有一个退出选项。如果某人决定他们不希望他们的邮件程序在覆盖范围较差的地区,或者在Skype电话或其他任何地方时检查电子邮件,该怎么办?如果他们想要,让他们退出电子邮件程序!
暂停和退出是两项至关重要的任务,也不能完成另一项任务。
答案 10 :(得分:19)
我认为重点是除非您有错误的软件,否则无需退出应用程序。 Android在用户未使用时退出应用程序,并且设备需要更多内存。如果您的应用需要在后台运行服务,您可能需要一种方法来关闭服务。
例如,当应用程序不可见时,Google Listen会继续播放播客。但是当用户完成播放时,总会有暂停按钮关闭播客。如果我没记错,Listen,甚至会在通知栏中放置一个快捷方式,这样您就可以快速进入暂停按钮。另一个例子是像Twitter应用程序这样的应用程序,它不断轮询互联网上的服务。这些类型的应用程序应该真正允许用户选择轮询服务器的频率,甚至是否在后台线程中进行轮询。
如果需要在退出时运行代码,可以根据需要覆盖onPause(),onStop()或onDestroy()。 http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle
答案 11 :(得分:19)
如果您无法理解如何使您的数据/连接(以及您的“应用程序”)持续存在,那么您将无法完成Android所需的操作。
那些下载那些可爱的小App Killers的人通常会发现他们没有帮助电池寿命或内存使用,但阻碍操作系统有效地管理内存......
http://android-developers.blogspot.com/2010/04/multitasking-android-way.html
答案 12 :(得分:18)
我会考虑阅读Addison-Wesley出版的“Android无线应用程序开发”。我刚刚完成它并且非常彻底。
您似乎对Android平台存在一些根本性的误解。我最初对Android应用程序的应用程序生命周期感到有些沮丧,但在得到更多的理解之后,我真的很喜欢这种方法。本书将回答您的所有问题以及更多问题。它确实是我为新Android开发人员找到的最佳资源。
另外,我认为您需要放弃现有应用的线到线端口。为了将您的应用程序移植到Android平台,一些应用程序设计将会发生变化。使用的应用程序生命周期是必要的,因为移动设备相对于桌面系统具有非常有限的资源,并且允许Android设备以有序和资源感知的方式运行多个应用程序。对平台进行更深入的研究,我想你会意识到你想做的事情是完全可行的。祝你好运。
顺便说一下,我与Addison-Wesley或任何与本书相关的人或组织没有任何关系。重新阅读我的帖子后,我觉得我有点狂热了。我真的,非常喜欢它,发现它非常有帮助。 :)
答案 13 :(得分:15)
几乎99%的时间内,Android应用程序无需接管自己的生命周期。大多数情况下,它归结为更好的规划或更智能的应用程序设计。例如,而是构建一个内部服务(未导出)来处理下载等,或围绕用户工作流设计操作和任务。
但话虽如此,有遗嘱的地方有办法。 Android提供 - 通过android.os.Process类,比Java更好的API来控制底层进程。与Java不同的是,它不会将开发人员隐藏在一个简单的java.lang.System.exit()调用之后,就像对待开发人员一样。
那么你如何要求你的应用程序在Android中自杀?好吧,诀窍很简单:
通过继承标准的android.app.Application类来创建自己的Android应用程序类(请记住在AndroidManifest.xml文件中声明它。)
覆盖onCreate()方法,并存储启动应用程序的进程ID:
this.pid = android.os.Process.myPid(); // Save for later use.
现在要杀死你的应用程序,提供一个kill()方法:
android.os.Process.sendSignal(pid, android.os.Process.SIGNAL_KILL);
现在,只要你需要你的应用程序自杀,只需输入应用程序上下文,然后调用你的kill方法!
((MySuicidalApp) context.getApplicationContext()).kill()
请记住,由于Android中的流程管理政策(特别是与服务相关),Android可能会选择重新启动您的服务(请参阅 You should not use task killers on Android )。
答案 14 :(得分:14)
当我在Android中构思应用程序时,我会这样看:
为此,您只需要手机的后退按钮或 Home 按钮(通过短按或长按)和通知栏。
当我退出我的应用程序时,我只使用 Back 按钮,直到我离开它或 Home 按钮。
我认为这就是大多数应用程序的构思方式。但是如果我需要某种会话或连接,我会通过登录/注销按钮和通知(标题栏或其他任何内容)向用户说明。这是一种与纯粹的“退出”风格应用程序完全不同的风格。
在PC上,你有一个多GUI桌面,在Android上,你显然有多个任务,但你一次只显示一个应用程序(我不在这里考虑小部件^^)。在移动电话上,您可以随时收到比您正在做的事情更重要的通知。
因此,应用程序的整个概念依赖于“进入应用程序 - 工作 - 退出应用程序”的不同内容。
答案 15 :(得分:12)
... Hmmmm
我认为你没有看到Android应用程序正确的方式。你可以轻松地做你想做的事情:
应用程序活动保存/恢复状态,如开发人员生命周期文档中所鼓励的那样。
如果在恢复阶段需要登录(没有可用的登录/会话信息),请执行此操作。
最后添加一个按钮/菜单/超时,在这种情况下,您将执行finish()
而不保存登录和其他会话信息,隐式地结束应用会话:所以如果应用程序启动/再次提出它将开始一个新的会议。
这样你就不会真正关心应用程序是否真的从内存中删除了。
如果你真的想从内存中删除它(这是不鼓励的,BTW用于什么目的?)你可以在onDestroy()
java.lang.System.exit(0)
结束时有条件地杀死它(或者{{1} }}?)。当然只在你想“真正结束应用程序”的情况下才这样做,因为restartPackage(..)
是活动正常生命周期的一部分,而不是应用程序结束。
答案 16 :(得分:11)
由于Android上下文中的应用程序只是一堆模糊的相关活动,因此退出应用程序并没有多大意义。您可以完成()一个Activity,并绘制Activity栈中前一个Activity的视图。
答案 17 :(得分:10)
我同意特德。我知道退出应用程序不是 “Android方式”,但它似乎不应该被排除。这里 您可能希望真正退出应用程序的原因有三个(不是 只是活动):
用户可能想要控制哪个应用被杀死了 内存不足的情况。如果重要的应用程序A在后台运行, 然后你可能想要在完成它之后退出应用程序B. 应用程序A不会被操作系统杀死。
如果您的应用程序将敏感数据缓存在内存中,您可能会 喜欢杀死应用程序,以便病毒/蠕虫/流氓应用程序无法获取它。一世 知道安全模型应该防止这种情况,但以防万一......
如果您的应用程序使用资源(如网络,CPU,传感器等) 这可能会对手机产生负面影响,从而确保这一点 释放这些资源就是退出应用程序。我明白 表现良好的应用程序应该在不需要时释放资源。但同样,退出应用程序似乎是确保这一点的合理方式。
答案 18 :(得分:10)
Linux内核有一个名为Out-of-memory killer的功能(如上所述,策略可在用户空间级别配置,内核也不是最佳的,但绝不必要)。
它被Android大量使用:
Android Notes (OOM杀手信息 - 您可以在Android上配置OOM功能)
某些用户空间应用可用于协助这些终止应用,例如:
答案 19 :(得分:9)
我希望事情会随着时间而改变。如果应用程序进程由操作系统正确沙箱,则用户应该能够终止应用程序或进程。有一种观念认为应该完美地编写应用程序,或者用户只使用遵循所有SDK建议的应用程序。我认为这是一项艰巨的任务。
答案 20 :(得分:9)
您显然已在finish()命令中找到了所需的答案。这不会从内存中移除您的应用,但Android会在需要资源时执行此操作,因此您不会明确地执行此操作。
我只想补充一点,为了达到应用程序退出通常具有的全部效果,您可能希望将应用程序的状态重置为设备启动后首次运行时的状态。 ,就在所有活动上调用finish()之前。这样,如果用户再次选择您的应用,它将显示为“新鲜”,没有任何状态从模拟“退出”之前的点留下。
如果某些特殊操作只能在“退出”时发生,例如保存用户的工作或其他任何操作,您也可以在上述例程的重新初始化部分之前执行它们。
这种方法可以让您实现“退出”命令的目标,而不会违反Android的操作系统手中的操作系统资源管理(包括关闭应用程序)的理念。
就个人而言,我不会使用这种方法,因为Android用户希望应用程序在重新访问时保持其连续性,因此他们不习惯“退出”应用程序的模式。我会支持一个“清除”功能,用户可以调用该功能将应用程序重置为某个默认的初始状态,而无需在此过程中“离开”它。
一个例外是当用户点击后退按钮足够次以使应用程序关闭时。在这种情况下,用户不会期望状态将被保存(如果应用程序中存在未保存状态,那么作为开发人员,您应该具有代码处理检测未保存数据的后退按钮,以及提示用户将其保存到SharedPreferences或文件或其他非易失性介质中。
关于system.exit(0):
如果您决定使用system.exit(0)以粗鲁的终结关闭您的应用程序(例如,由于最后的按钮按下),那么我会警告您,虽然对我来说这“有效”并且在某些情况下,这是我能够关闭应用程序而没有留下任何痕迹的唯一方法,当你使用这种方法时,在果冻豆中会发生一个小故障。
具体来说,如果您使用“最近的应用”列表打开您的应用,然后使用后退按钮关闭应用(通过system.exit(0)实现该关闭),则“最近的应用”列表将再次显示,因为它永远不会被关闭。如果您再点击该列表中的应用程序条目,从同一个已经打开的最近应用程序列表中第二次运行它,则无法响应。
我怀疑造成这种情况的原因是,由于您使用system.exit(0)关闭了应用程序,因此“最近的应用程序”列表将继续引用您的应用程序已无法正常运行。使用finish()更加文明地关闭你的应用程序可能会以一种允许它刷新其最近的应用程序列表的方式告知操作系统,但system.exit(0)显然不会这样做。
这本身并不是一个大问题,因为很少有人会从Recent Apps打开一个应用程序,然后退出它,然后立即从同一个打开的Recent Apps列表中再次打开它。如果他们点击主页按钮,然后重新打开最近的应用程序列表,您的应用程序的条目将在那里,并且它将完全正常运行。 但是我认为它表明使用system.exit(0)会干扰你的应用程序和操作系统之间的正常通信,这表明可能还有其他更严重的,可能是微妙的,使用这种方法的后果。
答案 21 :(得分:7)
如果应用程序开发人员没有退出函数来杀死他们自己的应用程序,那么设计是非常糟糕的。
我的应用程序需要允许用户在运行时动态地动态更改数据,并且用户需要重新启动我的应用程序以实现更改效果,但Android不允许我的应用程序自行重启。 Android OS的设计应用程序生命周期非常糟糕。
答案 22 :(得分:7)
有一个(相对)简单的设计,可以让你绕过&#34;退出&#34;难题。让您的应用拥有&#34; base&#34;状态(活动),它只是一个空白屏幕。在活动的第一个onCreate上,您可以启动应用程序主要功能所在的另一个活动。&#34;退出&#34;然后可以通过完成()第二个活动并返回到空白屏幕的基础来完成。操作系统可以将此空白屏幕保留在内存中,只要它想要...
从本质上讲,因为你无法退出到操作系统,你只需转换为自我创造的虚无。
答案 23 :(得分:7)
首先,永远不要永远不要使用System.exit(0)。这就像让一个人睡觉时一样冲他头!
第二:我正面临这个问题。在分享我的解决方案之前,我想分享一下我的想法。
我认为“退出按钮”是愚蠢的。真的很傻。而且我认为为您的应用程序要求退出按钮的用户(消费者)也是愚蠢的。他们不了解操作系统是如何工作的以及如何管理资源(并且它做得很好)。
我认为,如果你编写了一段代码,可以在正确的时刻和条件下做正确的事情(更新,保存和推送),并使用正确的东西(服务和接收器),它会很好地工作,不会一个人会抱怨。
但要做到这一点,你必须学习并了解Android的运作方式。 无论如何,这是我向用户提供“退出按钮”的解决方案。
我创建了一个在每个活动中始终可见的选项菜单(我是一个超级活动)。
当用户点击该按钮时,会发生以下情况:
Intent intent = new Intent(this, DashBoardActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
SharedPreferences settings = getSharedPreferences(getString(PREF_ID), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(FORCE_EXIT_APPLICATION, true);
// Commit the edits!
editor.commit();
startActivity(intent);
finish();
所以我保存在SharedPreferences中,我想杀死我的应用程序,然后启动一个Intent。请看那些旗帜;这些将清除我所有的后台,称我的DashBoard活动是我的“家”活动。
因此,在我的Dashboard Activity中,我在onResume中运行此方法:
private void checkIfForceKill() {
// CHECK IF I NEED TO KILL THE APP
// Restore preferences
SharedPreferences settings = getSharedPreferences(
getString(MXMSettingHolder.PREF_ID), Context.MODE_PRIVATE);
boolean forceKill = settings.getBoolean(
MusicSinglePaneActivity.FORCE_EXIT_APPLICATION, false);
if (forceKill) {
//CLEAR THE FORCE_EXIT SETTINGS
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(FORCE_EXIT_APPLICATION, false);
// Commit the edits!
editor.commit();
//HERE STOP ALL YOUR SERVICES
finish();
}
}
它会很好用。
我唯一不理解为什么会发生的事情是当我做最后一次完成时(我已经检查过:它正在跟随onPause→onStop→onDestroy的所有正确流程)应用程序仍在最近活动(但它是空白的)。
似乎最新的意图(启动了DashboardActivity)仍在系统中。
我要挖掘更多以便删除它。
答案 24 :(得分:6)
Android应用程序生命周期专为手机用户而非计算机用户设计。
应用程序生命周期是将Linux服务器转变为消费者设备所需的残酷简化范例。
Android是Java over Linux,一个真正的跨平台服务器操作系统。这就是它如此迅速地传播的方式。应用程序生命周期封装了操作系统的基本现实。
对于移动用户,只是安装或未安装应用。没有跑步或退出的概念。实际上,应用程序进程应该运行,直到操作系统为其持有的资源释放它们。
由于这是Stack Overflow,任何阅读此内容的人都是计算机用户,必须关闭90%的知识才能了解移动应用生命周期。
答案 25 :(得分:6)
每次通过意图移动到下一页时,请使用:
`YourActivityname.this.finish()`;
示例:强>
Intent intent = new Intent(getApplicationContext(), SMS.class);
startActivity(intent);
MainActivity.this.finish();
因此,不会在后台运行任何活动,当您想要退出您的应用时,请使用:
MainActivity.this.finish();
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
getParent().finish();
这种退出对我来说就像是一种魅力:)
答案 26 :(得分:6)
要在任何时候关闭应用,请在Intent中使用FLAG_ACTIVITY_CLEAR_TOP
标记然后system.exit();
或者有类似的方法,但是当你想要退出调用此方法时没有system.exit()
:
public void exit() {
startActivity(new Intent(this, HomeActivity.class).
setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK).putExtra(EXIT_FLAG, true));
}
在HomeActivity.onCreate()
添加以下代码
protected void onCreate(Bundle savedInstanceState) {
if (getIntent().getBooleanExtra(EXIT_FLAG, false)) {
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
finish();
}
}
......................
这将在不破坏Android生命周期的情况下发挥作用。
答案 27 :(得分:6)
阅读此Q&amp; A花了我更长的时间,而不是真正实现半适当的Android应用程序生命周期。
这是一个GPS应用程序,可以轮询点数并使用线程每隔几秒将当前位置发送到Web服务...这可以在Ted的情况下每隔5分钟轮询一次更新,然后onStop可以简单地启动更新活动Ted很关心是否找到了一个(异步Ted,不像Windows程序员那样编码,或者你的程序会像Windows程序一样运行......哇,这并不难)。
我在onCreate中做了一些初始代码,为活动生命周期设置了一些内容,包括checkUpdate.start();
:
...
@Override
public void onStart() {
super.onStart();
isRemote = true;
checkUpdate.resume();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 0, luh);
}
@Override
public void onPause() {
isRemote = false;
checkUpdate.suspend();
locationManager.removeUpdates(luh);
super.onStop();
}
此代码可能完全错误,但它可以正常工作。这是我的第一个Android应用程序之一。
Voilà,一个在后台运行时不消耗CPU的应用程序,但它可以立即重新打开,因为它在RAM中(虽然不像Android生命周期那样持有RAM)...应用程序随时可用,这是一部手机,男人/女孩。如果一个应用程序耗尽了所有RAM并且无法被操作系统关闭,那么事情可能会停止响铃= P这就是为什么操作系统需要能够在后台关闭你的应用程序(如果你的应用程序不是“资源耗尽它不会被关闭BTW”,所以让我们编写更好的应用程序。
答案 28 :(得分:4)
在任何情况下,如果您要终止申请,可以随时拨打System.exit(0);
。
答案 29 :(得分:3)
如果您有10,20 ..多个活动正在运行,并且您想要完成所有活动并退出系统。
在application class
或constants class.
<强>常量强>
public class Constants {
public static ArrayList<Activity> activities = new ArrayList<Activity>();
}
MainActivity 在此数组中添加当前活动引用
activity = MainActivity.this;
Constants.activities.add(activity);
public class MainActivity extends Activity {
private ImageView imageButton;
private Activity activity;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activity = MainActivity.this;
Constants.activities.add(activity);
imageButton = (ImageView) findViewById(R.id.camera);
imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// existing app.
if (Constants.activities != null) {
for (int i = 0; i < Constants.activities.size(); i++) {
Activity s = Constants.activities.get(i);
s.finish();
}
}
//super.finish();
finish();
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
}
});
}
}
答案 30 :(得分:2)
这很简单。请按照我将要告诉您的这些说明进行操作:
就像您正在进行多项活动一样,从一项活动转到另一项活动。你可能正在使用这样的意图:
Intent i1 = new Intent(this, AnotherActivity);
startActivity(i1)
您必须在从开始到结束的每个活动开始意图活动后添加finish();
,例如,
Intent i1=new Intent(this, AnotherActivity);
startActivity(i1)
finish();
因此,每当您单击使用finish()或System.exit(0)的退出按钮时,必须完全关闭应用程序。
答案 31 :(得分:2)
对于应用程序的第一个(开始)活动,
@Override
public void onBackPressed(){
// Exit
moveTaskToBack(true);
}
为我工作。我想在这里关闭应用程序。并从其他活动回来;我使用了意图,例如
@Override
public void onBackPressed(){
// Going back....
Intent intent = new Intent(ActivityB.this, ActivityA.class);
startActivity(intent);
finish();
}
注意:此代码对于开发人员希望从ActivityZ返回ActivityA然后关闭应用程序的情况非常有用。
答案 32 :(得分:1)
使用此代码:
Intent i = new Intent();
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_HOME);
ListActivity.this.startActivity(i);
finish();
答案 33 :(得分:0)
目前我在我的应用中实现了以下功能。这些可以帮助您从应用程序中移出您想要的任何内容。我从动作栏菜单中调用此功能。
public static void exitApplication(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
exitApplicationHC(context);
}
else {
exitApplicationPreHC(context);
}
}
private static void exitApplicationPreHC(Context context) {
Intent i = new Intent(context, LoginActivity.class);
i.putExtra(EXTRA_EXIT, true);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
if (context instanceof Activity) {
((Activity) context).finish();
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private static void exitApplicationHC(Context context) {
Intent i = new Intent(context, LoginActivity.class);
i.putExtra(EXTRA_EXIT, true);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(i);
}
答案 34 :(得分:0)
您可以使用Process.killProcess(Process.myPid());
来杀死您的应用,但可能不安全吗?使用此方法后,我没有遇到任何问题或崩溃,在使用此方法后,我的应用程序在DDMS列表中的过程消失了。
答案 35 :(得分:0)
如果您指定API&gt; = 16,则Activity#finishAffinity()符合您的需求。
答案 36 :(得分:0)
另一个选项可以是Android Accessibility Services Greenify Application正在使用它来强制关闭应用程序以加速内存。通过访问应用程序辅助功能服务,您可以单击按钮,以便基本上Greenify应用程序单击应用程序设置中的强制关闭按钮:
在这里,您可以学习辅助功能服务: https://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html
因此,您可以通过以下步骤实现杀死任何包含您的应用程序:
1)注册无障碍服务申请 2)根据您的要求,如果要杀死所有应用程序获取所有包的列表 3)导航到他们的设置屏幕并单击强制关闭按钮 而已。我可以分享一个示例代码我还创建了一个像greenify一样的应用程序作为家庭作业。 谢谢
更新: &#34;用户没有,系统会自动处理此问题。&#34; 因此,基本上使用此解决方案,我们间接使用系统强制关闭,但用户需求。所以两人都保持快乐: - )
答案 37 :(得分:0)
您可能已经花费了很多年为“适当的”计算机编写“适当的”程序。您说您正在学习编程。这只是您必须学习的内容之一。您不能花费数年时间进行水彩绘画,并假设油画的工作方式完全相同。这是八年前我编写第一个应用程序时对我来说是新概念的最起码的东西。
答案 38 :(得分:0)
作为Android的新手开发人员,我已经熟悉了生命周期等。作为Android用户,我一直讨厌不能淘汰应用程序。为什么任何用户都应该信任应用程序?我们可能认为将应用程序置于后台是“安全的”,但是用户呢? 我们可能会爱上“新”做事方式的天才,但并非所有应用程序都编写得完美甚至完美。有些可能是有害的,并试图始终保持后台进程运行。有些可能是出于善意,但有些混乱。我讨厌打开浏览器或Google并在我离开的最后一个地方启动,并且不得不回堆许多慢速页面,以至于感觉像一个全新的开始。用户应最终控制。技术支持人员告诉我们多少次“重新启动计算机”或“关闭程序并重新启动”?用户需要感觉到他们正在重新启动应用程序,而不是恢复可能使他们沮丧或引起问题的状态。您不能指望人们会保留仅使用应用程序就能完成某事的复杂环境模型。人们之所以能够控制铅笔和纸,是因为铅笔和纸的行为方式在将来会很明显。 软件是神奇的,一切都在幕后进行。其行为规则与创建它的开发人员一样反复无常。我们应该尝试设计与基本,几乎物理的模型相关的设备,这些模型要健壮,可靠并且对用户真正直观。用户可以拥抱“杀死”一个应用程序。就像扔出一堆草稿纸然后重新开始一样;关闭一本书并将其放回书架上。 Magic可以为敬业的专业人员提供场所,他们可以将自己投资于特定的世界,例如视频编辑或动画系统。这些用户经常自己贡献功能,因此对它们感到满意。但我认为,无论复杂程度如何,日常用户都应该至少拥有一些可以依靠的真正基础选项。我有一种简单的方法可以完全退出流程,即使它不是系统追求的目标模型。
答案 39 :(得分:-1)
退出按钮的一个重要原因是“退出”广告。在退出时,可以显示一些创收广告。与所有广告一样,它仍然有些烦人,但可能不会像使用珍贵的屏幕空间一直闲逛的东西那样烦人。一些广告网络提供这种广告方式。但是,实际上,您不能只是在显示该广告后放置一个无效的退出按钮!
因此,在某些情况下需要一种或另一种终止程序的方式,并且“永远不需要”可能不是最全面的答案。
可能会使用Activity.finish()或System.exit(0)。