继续我学习Android的尝试,我只是阅读以下内容:
问题:用户是否可以选择终止应用程序,除非我们使用菜单选项来杀死它?如果不存在这样的选项,用户如何终止该应用程序?
答案:(Romain Guy):用户没有,系统会自动处理.这就是活动生命周期(特别是onPause/onStop/onDestroy)的用途.无论你做什么,都不要放"退出"或"退出"应用程序按钮.它与Android的应用程序模型无关.这也与核心应用程序的工作方式相反.
呵呵,我在Android世界中采取的每一步都会遇到某种问题=(
显然,你无法在Android中退出应用程序(但Android系统可以很好地完全破坏你的应用程序).那是怎么回事?我开始认为编写一个充当"普通应用程序"的应用程序是不可能的 - 用户可以在他/她决定这样做时退出应用程序.这不应该依赖操作系统来做.
我尝试创建的应用程序不是Android Market的应用程序.它不是一般公众"广泛使用"的应用程序,它是一个将用于非常狭窄的业务领域的商业应用程序.
我实际上真的很期待为Android平台开发,因为它解决了Windows Mobile和.NET中存在的许多问题.然而,上周对我来说有点懈怠...我希望我不必放弃Android,但它现在看起来不太好=(
有没有办法让我真的退出申请?
Com*_*are 1271
这最终会回答你的问题,但我首先要解决你在各种意见中提出的一些问题,以及撰写本文时已经给出的各种答案.我无意改变你的想法 - 相反,这些是为了将来读这篇文章的其他人.
关键是我无法让Android确定何时终止我的应用程序.这必须是用户的选择.
数百万人对模型非常满意,因为环境会根据需要关闭应用程序.这些用户根本不考虑"终止"Android应用程序,而不是考虑"终止"网页或"终止"恒温器.
iPhone用户的方式大致相同,因为按下iPhone按钮不一定"感觉"就像应用程序被终止一样,因为许多iPhone应用程序都会在用户停止的地方启动,即使应用程序确实已关闭(因为仅限iPhone)目前允许一个第三方应用程序.
正如我上面所说,我的应用程序中发生了很多事情(数据被推送到设备,列表中的任务总是存在,等等).
我不知道"列出任务总是应该在那里"是什么意思,但"推送到设备的数据"是一个令人愉快的小说,在任何情况下都不应该由活动完成.使用计划任务(via AlarmManager)更新数据以获得最大可靠性.
我们的用户每次拨打电话时都会登录并且无法执行此操作,并且Android决定终止该应用.
有许多iPhone和Android应用程序可以解决这个问题.通常,这是因为它们保留登录凭据,而不是强制用户每次手动登录.
例如,我们想在退出应用程序时检查更新
这是任何操作系统的错误.如您所知,您的应用程序被"退出"的原因是操作系统正在关闭,然后您的更新过程将在流中失败.一般来说,这不是一件好事.检查启动时的更新或完全异步检查更新(例如,通过计划任务),从不退出.
一些评论表明,按下后退按钮并不会杀死应用程序(请参阅上面的问题中的链接).
按BACK按钮不会"杀死应用程序".当用户按下BACK按钮时,它完成屏幕上的活动.
它应该只在用户想要终止它时终止 - 从来没有任何其他方式.如果您无法编写Android中的行为类似的应用程序,那么我认为Android不能用于编写真实应用程序=(
那么Web应用程序也不行.或者WebOS,如果我正确理解他们的模型(还没有机会玩一个).在所有这些中,用户不会"终止"任何东西 - 他们只是离开.iPhone有点不同,因为它目前只允许一次运行(少数例外),因此离开行为意味着应用程序立即终止.
有没有办法让我真的退出申请?
正如其他人告诉你的那样,用户(通过BACK)或你的代码(via finish())可以关闭你当前正在运行的活动.对于正确编写的应用程序,用户通常不需要任何其他东西,只需要使用"退出"选项来使用Web应用程序.
根据定义,没有两个应用程序环境是相同的.这意味着当新的环境出现而其他环境被埋没时,您可以看到环境趋势.
例如,试图消除"文件"概念的行动越来越多.大多数Web应用程序不会强制用户考虑文件.iPhone应用程序通常不会强迫用户考虑文件.Android应用程序通常不会强迫用户考虑文件.等等.
同样,越来越多的人试图消除"终止"应用程序的概念.大多数Web应用程序不会强制用户注销,而是在一段时间不活动后隐式地将用户注销.与Android相同,在较小程度上,iPhone(可能还有WebOS)也是如此.
这需要更多地强调应用程序设计,关注业务目标,而不是坚持与先前应用程序环境相关的实现模型.缺乏时间或倾向于这样做的开发人员会因为破坏现有心理模型的新环境而感到沮丧.这不是任何一种环境的错,不仅仅是因为风暴在它周围流动而不是通过风暴的山脉的错误.
例如,一些开发环境,如Hypercard和Smalltalk,将应用程序和开发工具混合在一个设置中.这个概念没赶上了,语言扩展以外的应用程序(例如,VBA在Excel中,Lisp语言在AutoCAD).因此,想出应用程序本身存在开发工具的心理模型的开发人员要么必须改变他们的模型,要么将自己限制在他们的模型适用的环境中.
所以,当你写:
除了我发现的其他混乱的东西,我认为开发我们的Android应用程序是不会发生的.
对你来说,这对你来说似乎是最好的.同样,我会建议您不要尝试将应用程序移植到Web上,因为您在Android应用程序中报告的某些问题也会在Web应用程序中找到(例如,没有"终止").或者反过来说,如果有一天你做端口您的应用程序到Web,您可能会发现Web应用程序的流量可能是针对Android更好的匹配,你可以在那时再讲一个Android端口.
Nei*_*aft 289
我想在这里为这个帖子的未来读者添加一个更正.这种特殊的细微差别已经逃脱了我的理解很长一段时间,所以我想确保你们没有犯同样的错误:
System.exit()如果您在堆栈上有多个活动,则不会终止您的应用. 实际发生的是,进程被杀死并立即重新启动,堆栈上只有少量活动.这也是当您的应用程序被"强制关闭"对话框杀死时,甚至当您尝试从DDMS终止该进程时发生的情况.据我所知,这是一个完全无证的事实.
简短的回答是,如果你想退出你的应用程序,你必须跟踪你的堆栈中的所有活动以及finish()当用户想要退出时的所有活动(并且没有,没有办法遍历活动堆栈,所以你必须自己管理所有这些).即使这实际上并没有杀死你可能拥有的过程或任何悬空参考.它只是完成了活动.另外,我不确定是否Process.killProcess(Process.myPid())更好; 我没有测试过.
另一方面,如果您可以在堆栈中保留活动,那么还有另一种方法可以让您的工作变得非常简单:Activity.moveTaskToBack(true)只需将您的流程设置为背景并显示主屏幕即可.
长期答案涉及对这种行为背后的哲学的解释.哲学源于许多假设:
onSaveInstanceState,但是whaddya会怎么做?)对于大多数写得很好的Android应用程序,这应该是真的,因为你永远不知道什么时候你的应用程序会在后台被杀死.当你考虑它时,这适用于平台.首先,这正是当进程在后台被杀死并且用户返回它时发生的情况,因此需要在它停止的地方重新启动它.其次,这是当应用程序崩溃并呈现可怕的强制关闭对话框时发生的情况.
说我希望我的用户能够拍照并上传.我从我的活动中启动了Camera Activity,并要求它返回一张图片.Camera被推到我当前Task的顶部(而不是在自己的Task中创建).如果相机出现错误并且崩溃,是否会导致整个应用程序崩溃?从用户的角度来看,只有相机失败,应该将它们返回到之前的活动.所以它只是重新启动进程,堆栈中的所有相同活动,减去相机.由于你的活动应该被设计成可以在帽子上被杀死和恢复,这应该不是问题.不幸的是,并非所有应用程序都可以这样设计,因此无论Romain Guy或其他任何人告诉您,这对我们许多人来说都是一个问题.因此,我们需要使用变通方法.
所以,我的结论是:
finish()所有活动,要么致电moveTaskToBack(true).startActivity()使用包含该Intent.FLAG_ACTIVITY_CLEAR_TOP标志的Intent进行调用.and*_*rkz 178
我的所有应用程序都退出了按钮......由于这个原因,我经常得到用户的积极评价.我不关心平台是否以应用程序不需要它们的方式设计.说"不要把它们放在那里"有点荒谬.如果用户想要退出...我向他们提供了完全相同的访问权限.我认为它根本不会减少Android的运行方式,这似乎是一种很好的做法.我了解生命周期......我的观察是Android在处理它方面做得不好....这是一个基本事实.
Eri*_*ric 143
不要将您的应用程序视为单一应用程序.它是一组用户可以与您的"应用程序"交互的UI屏幕,以及通过Android服务提供的"功能".
不知道你的神秘应用"做什么"并不重要.让我们假设它隧道进入一些超级安全的企业内部网,执行一些监控或交互,并保持登录状态,直到用户"退出应用程序".由于您的IT部门会命令它,因此用户必须非常清楚Intranet的IN或OUT.因此,您的心态对于用户"退出"非常重要.
这很简单.制作一项服务,在通知栏中发出持续通知,说"我在内联网,或者我正在运行".让该服务执行您的应用程序所需的所有功能.拥有绑定到该服务的活动,以允许您的用户访问他们与您的"应用程序"交互所需的UI.并有一个Android菜单 - >退出(或注销,或其他)按钮,告诉服务退出,然后关闭活动本身.
对于所有意图和目的,这正是你想要的.完成Android方式.查看Google Talk或Google Maps Navigation,了解这种"退出"的可能性.唯一的区别是,在您的活动中按下后退按钮可能会让您的UNIX进程处于等待状态,以防用户想要恢复您的应用程序.这与在内存中缓存最近访问的文件的现代操作系统没有什么不同.退出Windows程序后,很可能它所需的资源仍在内存中,等待被其他资源替换,因为它们已被加载,因为它们已不再需要.Android是一回事.
我真的没有看到你的问题.
Pau*_*aul 71
This is an interesting and insightful discussion with so many experts contributing. I feel this post should be looped back from within the Android development main website, because it does revolve around one of the core designs of the Android OS.
I would also like to add my two cents here.
So far I have been impressed with Android's way of handling lifecycle events, bringing the concept of a web-like experience to native apps.
Having said that I still believe that there should be a Quit button. Why? ... not for me or Ted or any of the tech gurus here, but for the sole purpose of meeting an end user demand.
Though I am not a big fan of Windows, but long back they introduced a concept that most end users are used to (an X button) ... "I want to quit running a widget when 'I' want to".
That does not mean someone (OS, developer?) will take care of that at its/his/her own discretion... it simply means "where is my Red X button that I am used to". My action should be analogous to 'end a call on pressing of a button', 'turn off the device by pressing a button', and so on and so forth ... it's a perception. It brings a satisfaction per se that my action indeed achieve its purpose.
Even though a developer can spoof this behavior using suggestions given here, the perception still remains i.e. an application should completely cease to function (now), by an independent, trusted and neutral source (OS) on demand from the end user.
Chr*_*Orr 37
你可以退出,或者通过按下Back按钮或调用finish()你的Activity.如果您想明确地将其删除,只需finish()从a 调用MenuItem即可.
Romain并不是说它无法完成,只是它没有意义 - 用户不需要关心放弃或保存他们的工作或其他任何东西,因为应用程序生命周期的工作方式鼓励您编写自动保存和自动保存的智能软件无论发生什么,都要恢复它的状态.
Cha*_*ock 31
这场辩论归结为一个古老的问题,即开发人员是最了解还是用户最了解.人类因素的各个领域的专业设计师每天都在努力解决这个问题.
Ted指出,市场上下载次数最多的应用之一就是"App Killer".当人们退出申请时,人们会获得一些额外的血清素.他们已经习惯了桌面/笔记本电脑.它可以让事情快速发展.它可以使处理器保持冷却并且风扇不会打开.它使用更少的电力.
当你认为移动设备是一个小得多的船,那么你可以特别欣赏他们"抛弃你不再需要的东西"的动机.现在Android的开发人员已经推断出操作系统最了解并且退出应用程序是古董.我全心全意地支持这一点.
但是,我也相信你不应该挫败用户,即使这种挫败感是出于他们自己的无知.因此,我得出结论,"退出"选项是一个很好的设计,即使它主要是一个安慰剂按钮,只能关闭一个视图.
Aar*_*ron 29
特德,你想要完成的事情可能已经完成,也许不是你现在如何思考它.
我建议你阅读活动和服务.停止使用术语"app"并开始引用组件,即Activity,Service.我想您只需要了解有关Android平台的更多信息; 它是标准PC应用程序的思维方式的变化.事实上,你的帖子中没有任何帖子中有"活动"(缺少常见问题引用,即不是你的话),这告诉我你需要阅读更多内容.
Dhe*_*.S. 23
博客文章时包括在Android应用中退出按钮(提示:切勿)解释的那样远,远远比我可以更好.我希望每个Android开发者都已经阅读过它.
摘录:
根据我的经验,[用户]真正想要的是: 确保应用程序停止消耗资源(电池,CPU周期,数据传输等)的明确方法.
许多用户认为退出按钮实现了此要求并要求添加该要求.希望取悦用户的开发人员必须添加一个.此后不久,他们都失败了.
- 在大多数情况下,退出按钮只是调用
Activity.finish().这完全等同于按下后退按钮. 究竟. 服务不断运行,轮询不断发生.用户可能认为他们已经杀了应用程序,但他们没有,很快他们会更加恼火.- 退出行为现在不明确.您的退出按钮是应该关闭活动,还是应该还停止所有关联的服务,接收器和警报?该怎么Back办?如果他们打了Home相反会发生什么?如果您的应用有小部件,会发生什么?退出按钮是否应该停止更新?
解决方案是使后退按钮的行为与您期望的退出按钮相同.更好的是,只要应用程序不可见,就停止消耗资源.
继续阅读完整的文章.
Jes*_*don 20
答案:(Romain Guy):用户没有,系统会自动处理.这就是活动生命周期(特别是onPause/onStop/onDestroy)的用途.无论你做什么,都不要放"退出"或"退出"应用程序按钮.它与Android的应用程序模型无关.这也与核心应用程序的工作方式相反.
1:完全退出申请可能通常是无意义的,但它并非毫无用处.如果Windows没有退出选项怎么办?当内存已满并且操作系统不得不猜测你完成了哪些程序时,系统会很慢.我不在乎Romain Guy甚至Larry Page和Sergey Brin所说的 - 这些都是不容置疑的事实:系统运行速度较慢,因为他们必须先杀死任务才能在启动新应用之前获取内存.你不能告诉我,杀死一个应用程序并不需要时间!甚至来自遥远恒星的光需要时间......还有就是在允许用户完全关闭一些应用程序使用.
2:与核心应用程序的工作方式相反?那是什么意思?当我现在正在运行一个应用程序时,它不再做任何工作了...它只是等待操作系统在需要内存时被杀死.
总之,在最小化和退出之间存在明显的差异,并且对于另一个而言,两个都没有很好的结合.我们是否在每个螺丝上留下螺丝刀?或者每扇门都有钥匙?我们是否将所有设备都置于高位,直到断路器爆炸并且我们需要打开另一台设备?我们是否将洗碗机放在盘子里,每次只取出足够的空间来为一些新的脏衣服腾出空间?我们是否让所有车辆都在车道上行驶,直到 - 哦,没关系.
如果用户想要最小化应用程序,那么最好的方法是最小化它.如果用户想要退出应用程序,那么无论如何最好退出.
它不受欢迎吗?这是Android的观点 - 他们对此不以为然.许多独立的新手Android开发者对此赞不绝口.
但是当它接近它时,就会有良好的编码和糟糕的编码.有很好的程序流模型,并且有不良的程序流模型.
当用户知道程序完成后,将程序留在内存中并不是一个好的程序流程.它完全没有任何意义,并且在启动新应用程序或运行应用程序分配更多内存时会降低速度.
它有点像你的车:有时你会让它继续运行,比如在停车灯处停车,或者快餐开车,或者在自动取款机停车.但是在其他情况下你确实想把它关掉 - 就像你上班,杂货店甚至家里一样.
同样,如果你正在玩游戏并且手机响了,是的.暂停游戏并保持运行.但是如果用户已完成游戏一段时间,那么一定要让他们退出.
某些应用程序上的退出按钮应该比其他应用程序更加突出.例如,游戏或用户可能想要完全退出的程序应该有明显的退出.其他程序,比如,可能是电子邮件程序,退出是不太可能的愿望(这样它可以继续检查电子邮件) - 这些程序不应该浪费主要控制输入屏幕空间的退出选项,但为了良好的程序流程,它应该有一个退出选项.如果某人决定他们不希望他们的邮件程序在覆盖范围较差的地区,或者在Skype电话或其他任何地方时检查电子邮件,该怎么办?如果他们想要,让他们退出电子邮件程序!
暂停和退出是两项至关重要的任务,既不能完成另一项任务.
Jay*_*ren 19
我认为重点是除非你有错误的软件,否则不需要退出应用程序.Android在用户未使用时退出应用程序,并且设备需要更多内存.如果您的应用需要在后台运行服务,您可能需要一种方法来关闭服务.
例如,当应用程序不可见时,Google Listen会继续播放播客.但是当用户完成播放时,总会有暂停按钮关闭播客.如果我没记错,Listen,甚至会在通知栏中放置一个快捷方式,这样您就可以快速进入暂停按钮.另一个例子是像Twitter应用程序这样的应用程序,它不断轮询互联网上的服务.这些类型的应用程序应该真正允许用户选择轮询服务器的频率,甚至是否在后台线程中进行轮询.
如果需要在退出时运行代码,可以根据需要覆盖onPause(),onStop()或onDestroy(). http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle
Dan*_*Dan 19
如果您无法理解如何使您的数据/连接(以及您的"应用程序")持续存在,那么您将无法完成Android所需的操作.
那些下载那些可爱的小App Killers的人通常会发现他们没有帮助电池寿命或内存使用,但阻碍了操作系统有效管理内存的工作......
http://android-developers.blogspot.com/2010/04/multitasking-android-way.html
小智 18
我会考虑阅读Addison-Wesley出版的"Android无线应用程序开发".我刚刚完成它,非常彻底.
您似乎对Android平台存在一些根本性的误解.我也曾经在第一次与Android应用程序的应用程序生命周期有点沮丧,而是来到了一个更深入的了解之后,我是来真的很喜欢这种方法.本书将回答您的所有问题以及更多问题.它确实是我为新的Android开发人员找到的最好的资源.
此外,我认为你需要放弃现有应用程序的line-for-line端口.为了将您的应用程序移植到Android平台,一些应用程序设计将会发生变化.所使用的应用程序生命周期是必要的,因为移动设备具有相对于桌面系统的资源非常有限,并允许Android设备运行有序和资源意识的时尚几个应用程序.对平台进行更深入的研究,我想你会意识到你想做的事情是完全可行的.祝你好运.
顺便说一句,我与Addison-Wesley或任何与本书相关的人或组织没有任何关系.重新阅读我的帖子后,我觉得我有点狂热了.我真的,非常喜欢它,发现它非常有帮助.:)
And*_*ies 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.
Run Code Online (Sandbox Code Playgroud)
现在要杀死你的应用程序,提供一个kill()方法:
android.os.Process.sendSignal(pid, android.os.Process.SIGNAL_KILL);
Run Code Online (Sandbox Code Playgroud)
现在,只要你需要你的应用程序自杀,只需输入应用程序上下文,并调用你的kill方法!
((MySuicidalApp) context.getApplicationContext()).kill()
Run Code Online (Sandbox Code Playgroud)
请记住,由于Android中的流程管理策略(特别是与服务相关),Android可能会选择重新启动您的服务(请参阅您不应在Android上使用任务杀手).
Sol*_*n14 14
当我在Android中构思应用程序时,我会这样看:
要做到这一点,您只需要手机的Back按钮或Home按钮(通过短按或长按)和通知栏.
当我退出我的应用程序时,我只使用Back按钮,直到我离开它或Home按钮.
这就是我认为大多数应用程序的构思方式.但是如果我需要某种会话或连接,我会通过登录/注销按钮和通知(标题栏或其他任何内容)向用户说明.这是一种与纯粹的"退出"风格应用程序完全不同的风格.
在PC上,你有一个多GUI桌面,在Android上,你显然有多个任务,但你一次只显示一个应用程序(我不在这里考虑小部件^^).在移动电话上,您可以随时收到比您正在做的事情更重要的通知.
因此,应用程序的整个概念依赖于"进入应用程序 - 工作 - 退出应用程序"的不同内容.
小智 12
Hmmmm ...
我认为你没有看到Android应用程序正确的方式.您可以轻松地执行您想要的操作:
应用程序活动是否像开发人员生命周期文档中所鼓励的那样保存/恢复状态.
如果在还原阶段需要某些登录(没有可用的登录/会话信息),那么执行此操作.
最后添加一个按钮/菜单/超时,在这种情况下,您将在finish()不保存登录和其他会话信息的情况下执行操作,隐式地结束应用程序会话:因此,如果应用程序启动/再次启动,它将启动新会话.
这样你就不会真正关心应用程序是否真的从内存中删除了.
如果你真的想从内存中删除(这是气馁,BTW目的是什么?),你可以在年底有条件杀死它onDestroy()与java.lang.System.exit(0)(或可能restartPackage(..)?).当然只在你想"真正结束应用程序"的情况下才这样做,因为它onDestroy()是活动正常生命周期的一部分而不是应用程序结束.
Tom*_*m R 11
由于Android上下文中的应用程序只是一堆模糊的相关活动,因此退出应用程序并没有多大意义.您可以完成()一个Activity,并绘制Activity栈中前一个Activity的视图.
Bur*_*rke 10
我同意泰德.我知道退出应用程序不是"Android方式",但它似乎不应该被排除.以下是您可能希望真正退出应用程序(而不仅仅是活动)的三个原因:
在内存不足的情况下,用户可能希望控制哪个应用程序被杀死.如果重要的应用程序A在后台运行,那么您可能希望在完成后退出应用程序B,以便应用程序A不会被操作系统杀死.
如果您的应用程序将敏感数据缓存在内存中,您可能希望杀死该应用程序,以便病毒/蠕虫/流氓应用程序无法获取它.我知道安全模型应该防止这种情况,但以防万一......
如果您的应用程序使用可能对手机产生负面影响的资源(如网络,CPU,传感器等),那么确保释放这些资源的一种方法是退出应用程序.我知道,表现良好的应用程序应该在不需要时释放资源.但同样,退出应用程序似乎是确保这一点的合理方式.
Pet*_*eoh 10
Linux内核有一个名为Out-of-memory killer的功能(如上所述,策略可在用户空间级别配置,并且内核不是最佳策略,但绝不必要).
它被Android大量使用:
Android Notes(OOM杀手信息 - 您可以在Android上配置OOM功能)
一些用户空间应用程序可用于协助这些终止应用程序,例如:
我希望事情会随着时间而改变.如果应用程序进程由操作系统正确沙箱,则用户应该能够终止应用程序或进程.有一种观念认为应该完美地编写应用程序,或者用户只使用遵循所有SDK建议的应用程序.我认为这是一项艰巨的任务.
您显然已在finish()命令中找到了所需的答案.这不会从内存中移除您的应用程序,但Android会在需要资源时执行此操作,因此您不会明确地执行此操作没有任何区别.
我只想补充一点,为了达到应用程序退出通常具有的全部效果,您可能希望将应用程序的状态重置为设备启动后首次运行时的状态.在所有活动上调用finish().这样,如果用户再次选择您的应用程序,它将显示为"新鲜",没有任何状态从模拟"退出"之前的点遗留下来.
如果某些特殊操作只应在"退出"时发生,例如保存用户的工作或其他任何操作,您也可以在上述例程的重新初始化部分之前执行它们.
这种方法允许您实现"退出"命令的目标,而不违反Android的操作系统手中的操作系统资源管理(包括关闭应用程序)的理念.
就个人而言,我不会使用这种方法,因为Android用户希望应用程序在重新访问时保持其连续性,因此他们不习惯"退出"应用程序的模式.我会支持一个"清除"功能,用户可以调用该功能将应用程序重置为某个默认的初始状态,而无需在此过程中"离开"它.
一个例外是当用户按下后退按钮足够次数以使应用程序关闭时.在这种情况下,用户不会期望状态将被保存(如果应用程序中存在未保存状态,那么作为开发人员,您应该具有代码处理检测未保存数据的后退按钮,以及提示用户将其保存到SharedPreferences或文件或其他非易失性介质中.
关于system.exit(0):
如果你决定使用system.exit(0)以粗鲁的终结关闭你的应用程序(例如,由于最后的后退按钮按下),那么我会警告你,虽然对我来说这"工作",并在一些case是我能够关闭应用程序而没有留下任何痕迹的唯一方法,当你使用这种方法时,Jelly Bean会发生一个小故障.
具体来说,如果您使用"最近的应用程序"列表打开您的应用程序,然后使用后退按钮关闭应用程序(通过system.exit(0)实现该关闭),则"最近的应用程序"列表将再次可见,因为它将从未关闭过.然后,如果您点击该列表中的应用程序条目,再次从同一个已经打开的"最近的应用程序"列表中运行它,则不会有任何响应.
我怀疑造成这种情况的原因是,由于您使用system.exit(0)关闭了应用程序,最近的应用程序列表将继续引用您的应用程序已无法正常运行.使用finish()更加文明地关闭你的应用程序可能会以一种允许它刷新其最近的应用程序列表的方式告知操作系统,但system.exit(0)显然不会这样做.
这本身并不是一个大问题,因为很少有人会从Recent Apps打开一个应用程序,然后退出它,然后立即从同一个打开的Recent Apps列表中再次打开它.如果他们点击主页按钮,然后重新打开最近的应用程序列表,您的应用程序的条目将在那里,并且它将完全正常运行. 但我认为它表明使用system.exit(0)可能会干扰您的应用程序与操作系统之间的正确通信,这表明使用此方法可能会产生其他更严重,可能更微妙的后果.
小智 7
没有退出功能,应用程序开发人员就可以杀死自己的应用程序,这是非常糟糕的设计.
我的应用程序需要允许用户在运行时动态地动态更改数据,并且用户需要重新启动我的应用程序以实现更改效果,但Android不允许我的应用程序自行重启.Android OS的设计应用程序生命周期非常糟糕.
小智 7
有一个(相对)简单的设计,可以让你绕过"退出"难题.使您的应用程序具有"基本"状态(活动),这只是一个空白屏幕.在活动的第一个onCreate上,您可以启动应用程序主要功能所在的另一个活动.然后可以通过finish()第二个活动完成"退出",然后返回到空白屏幕的基础.操作系统可以将此空白屏幕保留在内存中,只要它想要...
从本质上讲,因为你不能退出操作系统,你只需转换成自我创造的虚无.
首先,永远不要永远不要使用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();
Run Code Online (Sandbox Code Playgroud)
所以我保存在SharedPreferences中,我想要杀死我的应用程序,然后我开始一个Intent.请看那些旗帜; 这些将清除我的所有后台调用我的DashBoard活动,这是我的"家"活动.
所以在我的仪表板活动中,我在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();
}
}
Run Code Online (Sandbox Code Playgroud)
它会很好用.
我唯一不理解为什么会发生这种事情的是当我做最后一次完成时(我已经检查过:它正在跟随onPause→onStop→onDestroy的所有正确流程),应用程序仍在最近的活动中(但是这是空白的).
似乎最新的意图(已启动DashboardActivity)仍在系统中.
我要挖掘更多,以便删除它.
小智 6
我花了更长的时间来阅读这个Q&A而不是实际实现半适当的Android应用程序生命周期.
这是一个GPS应用程序轮询点并使用线程每隔几秒将当前位置发送到Web服务...这可以在Ted的情况下每5分钟轮询一次更新,然后onStop可以简单地启动更新活动Ted是soo关心是否找到了一个(异步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();
}
Run Code Online (Sandbox Code Playgroud)
这段代码可能完全错误,但它确实有效.这是我的第一个Android应用程序之一.
Voilà,一个在后台运行时不消耗CPU的应用程序,但它可以立即重新打开,因为它在RAM中(虽然不像Android生命周期那样持有RAM)...应用程序随时可用,它是一部手机,伙计们/加尔斯.如果一个应用程序耗尽了所有RAM并且无法通过操作系统关闭,那么事情可能会停止响铃= P这就是为什么操作系统需要能够在后台关闭你的应用程序(如果你的应用程序不是资源问题它不会被关闭BTW),所以让我们编写更好的应用程序.
要在任何时候关闭应用程序,请FLAG_ACTIVITY_CLEAR_TOP在Intent中使用标志然后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));
}
Run Code Online (Sandbox Code Playgroud)
在您HomeActivity.onCreate()添加以下代码中
protected void onCreate(Bundle savedInstanceState) {
if (getIntent().getBooleanExtra(EXIT_FLAG, false)) {
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
finish();
}
}
......................
Run Code Online (Sandbox Code Playgroud)
这将在不破坏Android生命周期的情况下运行.
每次通过意图移动到下一页时,请使用:
`YourActivityname.this.finish()`;
Run Code Online (Sandbox Code Playgroud)
例:
Intent intent = new Intent(getApplicationContext(), SMS.class);
startActivity(intent);
MainActivity.this.finish();
Run Code Online (Sandbox Code Playgroud)
因此,不会在后台运行任何活动,当您要退出应用程序时,请使用:
MainActivity.this.finish();
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
getParent().finish();
Run Code Online (Sandbox Code Playgroud)
这个退出对我来说就像一个魅力:)
Android应用程序生命周期专为移动电话用户而非计算机用户设计.
应用程序生命周期是将Linux服务器转变为消费者设备所需的残酷简化范例.
Android是Java over Linux,一个真正的跨平台服务器操作系统.这就是它如此迅速地传播的方式.应用程序生命周期封装了操作系统的基本现实.
对于移动用户,只是安装或未安装应用程序.没有跑步或退出的概念.事实上,应用程序进程应该运行,直到操作系统为其持有的资源释放它们.
由于这是Stack Overflow,任何阅读此内容的人都是计算机用户,必须关闭90%的知识才能了解移动应用程序的生命周期.
小智 6
您可能花了很多年的时间为“合适的”计算机编写“合适的”程序。你说你正在学习Android编程。这只是你必须学习的事情之一。你不能花费数年时间画水彩画并假设油画的工作原理完全相同。当我八年前编写第一个应用程序时,这对我来说是最不新鲜的概念。
| 归档时间: |
|
| 查看次数: |
270732 次 |
| 最近记录: |