题 退出申请不赞成?


继续我试图学习Android,我只是 阅读以下

题: 用户是否可以选择终止该应用程序   除非我们放一个菜单选项来杀死它?如果不存在这样的选项,   用户如何终止申请?

答案:(Romain Guy): 用户没有,系统自动处理。这就是活动生命周期(尤其是onPause / onStop / onDestroy)的用途。无论你做什么,都不要放“退出”或“退出”应用程序按钮。它与Android的应用程序模型无关。这也与核心应用程序的工作方式相反。

呵呵,我在Android世界中采取的每一步都遇到了某种问题=(

显然,你无法在Android中退出应用程序(但Android系统可以很好地完全破坏你的应用程序)。那是怎么回事?我开始认为编写一个充当“普通应用程序”的应用程序是不可能的 - 用户可以在他/她决定这样做时退出应用程序。这不应该依赖操作系统来做。

我尝试创建的应用程序不是Android Market的应用程序。它不是一般公众“广泛使用”的应用程序,它是一个将用于非常狭窄的业务领域的商业应用程序。

我实际上真的很期待为Android平台开发,因为它解决了Windows Mobile和.NET中存在的许多问题。然而,上周对我来说有点懈怠...我希望我不必放弃Android,但它现在看起来不太好=(

我有办法吗?  退出申请?


1037


起源




答案:


这最终会回答你的问题,但我首先要解决你在各种评论中提出的一些问题,以及撰写本文时已经给出的各种答案。我无意改变你的想法 - 相反,这些是为了将来读这篇文章的其他人。

关键是我不能允许   Android确定我的应用程序何时   将被终止。那一定是   用户的选择。

数百万人对模型非常满意,因为环境会根据需要关闭应用程序。这些用户根本不考虑“终止”Android应用程序,而不是考虑“终止”网页或“终止”恒温器。

iPhone用户的方式大致相同,因为按下iPhone按钮不一定“感觉”就像应用程序被终止一样,因为许多iPhone应用程序都会在用户停止的地方启动,即使应用程序确实已关闭(因为仅限iPhone)目前允许一个第三方应用程序。

正如我上面所说,有很多   在我的应用程序中发生的事情(数据是   推送到设备,列出任务   总是应该在那里,等等。

我不知道“列出任务总是应该在那里”是什么意思,但“推送到设备的数据”是一个令人愉快的小说,在任何情况下都不应该由活动完成。使用计划任务(通过 AlarmManager)更新您的数据以获得最大可靠性。

我们的用户登录后无法进行操作   每次他们接到电话   和Android决定杀死该应用程序。

有许多iPhone和Android应用程序可以解决这个问题。通常,这是因为它们保留登录凭据,而不是强制用户每次手动登录。

例如,我们想检查更新   退出应用程序时

这是任何操作系统的错误。如您所知,您的应用程序被“退出”的原因是操作系统正在关闭,然后您的更新过程将在流中失败。一般来说,这不是一件好事。检查启动时的更新或完全异步检查更新(例如,通过计划任务),永远不要退出。

一些评论建议击中   后退按钮不会杀死应用程序   所有(见上面我的问题中的链接)。

按BACK按钮不会“杀死应用程序”。当用户按下BACK按钮时,它完成屏幕上的活动。

它应该只在终止时终止   用户希望终止它 - 永远不会   任何其他方式。如果你不能写   在Android中表现得像的应用,   然后我认为Android无法使用   用于编写真实应用程序=(

那么Web应用程序也不行。要么 WebOS的,如果我正确理解他们的模型(还没有机会玩一个)。在所有这些中,用户不会“终止”任何东西 - 他们只是离开。 iPhone有点不同,因为它目前只允许一次运行(少数例外),因此离开行为意味着应用程序立即终止。

有没有办法让我真正戒烟   应用程序?

正如其他人告诉你的那样,用户(通过BACK)或你的代码(通过 finish())可以关闭当前正在运行的活动。对于正确编写的应用程序,用户通常不需要任何其他东西,只需要使用“退出”选项来使用Web应用程序。


根据定义,没有两个应用程序环境是相同的。这意味着当新的环境出现而其他环境被埋没时,您可以看到环境趋势。

例如,试图消除“文件”概念的行动越来越多。大多数Web应用程序不会强制用户考虑文件。 iPhone应用程序通常不会强迫用户考虑文件。 Android应用程序通常不会强迫用户考虑文件。等等。

同样,越来越多的人试图消除“终止”应用程序的概念。大多数Web应用程序不会强制用户注销,而是在一段时间不活动后隐式地将用户注销。 Android(以及可能的WebOS)在较小程度上与Android相同。

这需要更多地强调应用程序设计,关注业务目标,而不是坚持与先前应用程序环境相关联的实现模型。缺乏时间或倾向于这样做的开发人员会因为破坏现有心理模型的新环境而感到沮丧。这不是任何一种环境的错,不仅仅是因为风暴在它周围流动而不是通过风暴的山脉的错误。

例如,某些开发环境,如 超卡 和Smalltalk,将应用程序和开发工具混合在一个设置中。除了应用程序的语言扩展之外,这个概念并没有引起太多关注(例如, VBA 在 高强Lisp在AutoCAD中)。因此,想出应用程序本身存在开发工具的心理模型的开发人员要么必须改变他们的模型,要么将自己限制在他们的模型适用的环境中。

所以,当你写:

和其他杂乱的事情一起   发现,我认为发展   我们的Android应用程序不会   发生。

对你来说,这对你来说似乎是最好的。同样,我建议您不要试图将您的应用程序移植到Web上,因为您在Android应用程序中报告的一些相同问题也会在Web应用程序中找到(例如,没有“终止”)。或者,相反,总有一天,如果你  将您的应用程序移植到Web上,您可能会发现Web应用程序的流程可能更适合Android,您可以在那时重新访问Android端口。


1217



一个想法在我脑海中漂浮:如果我只是将整个应用程序重写为服务,并将该服务视为实际应用程序 - 也许这会更好?然后,我可以“愚蠢”活动(就像Android想要的那样)只显示服务中包含的数据。在那种情况下,我可以保持登录状态和其他东西。运用 startForeground(int,Notification) 我几乎可以阻止Android杀死服务......? - Ted
“请注意,我的用户是专业人士,使用该设备的唯一目的是使用我尝试移植到Android的应用程序。”实际上,你已经另有说明(“每次他们接到电话时都不能这样做” - “电话”不是你的应用程序)。此外,除非您构建自己的设备,否则无法阻止人们安装其他应用程序。 - CommonsWare
@SomeCallMeTim:不,这不是一个有效的理由 killProcess()。这是编写更好的iOS代码的正当理由。 - CommonsWare
@CommonsWare:对不起,但这是一个对我没用的陈腐的答案。我正在移植我付给端口的代码。我应该花两倍的时间来做端口,重写代码,还是以降低雇主成本的方式完成它,让他们能够更快地在Android上放置更多游戏?无论如何,这是一个完全学术性的问题:他们不希望我对他们的引擎做出如此重大的改变,因为我无法测试iOS上的变化。而且这是完全错误的:将Singleton模式用于适当的对象并没有“坏”。 Android只是破坏了WRT NDK应用程序。 - SomeCallMeTim
@Ted用于更可靠的重新初始化,也许您可​​以最小化存储在活动或服务本身的状态量。相反,将大部分状态和代码放在一个单独的类中,每次活动或服务启动时,您都会从头开始重新创建。 - Qwertie


我想在这里为这个帖子的未来读者添加一个更正。这种特殊的细微差别已经逃脱了我的理解很长一段时间,所以我想确保你们没有犯同样的错误:

System.exit() 如果您在堆栈上有多个活动,则不会终止您的应用。  实际发生的是 该进程被终止并立即重新启动 在堆栈上减少一个活动。这也是当您的应用程序被“强制关闭”对话框杀死时,甚至当您尝试从DDMS终止该进程时发生的情况。据我所知,这是一个完全无证的事实。

简而言之,如果你想退出你的应用程序,你必须跟踪你的堆栈中的所有活动 finish() 当用户想要退出时所有这些(并且没有,没有办法遍历Activity堆栈,所以你必须自己管理所有这些)。即使这实际上并没有杀死你可能拥有的过程或任何悬空参考。它只是完成了活动。另外,我不确定是否 Process.killProcess(Process.myPid()) 效果更好;我没有测试过。

另一方面,如果您可以在堆栈中保留活动,那么还有另一种方法可以让您轻松自如: Activity.moveTaskToBack(true) 将简单地显示您的过程并显示主屏幕。

长期答案涉及对这种行为背后的哲学的解释。哲学源于许多假设:

  1. 首先,只有当您的应用程序位于前台时才会发生这种情况。如果它在后台,则该过程将终止正常。但是,如果它位于前台,则OS假定用户想要继续做他/她正在做的事情。 (如果你试图从DDMS中杀死进程,你应该首先点击主页按钮,然后杀死它)
  2. 它还假设每项活动都独立于所有其他活动。这通常是正确的,例如在您的应用程序启动浏览器活动的情况下,该活动完全独立且不是您编写的。浏览器活动可能会也可能不会在同一个任务上创建,具体取决于其清单属性。
  3. 它假设您的每项活动都是完全自立的,可以在一瞬间被杀死/恢复。 (我宁愿不喜欢这个特殊的假设,因为我的应用程序有许多依赖于大量缓存数据的活动,太大而无法有效地序列化 onSaveInstanceState但是whaddya会怎么做?)对于大多数写得很好的Android应用程序,这应该是真的,因为你永远不知道你的应用程序什么时候会在后台被杀掉。
  4. 最后一个因素不是假设,而是操作系统的限制: 显式杀死应用程序与应用程序崩溃相同,也与Android杀死应用程序以回收内存相同。  这最终导致了我们的优势:由于Android无法判断应用程序是退出或崩溃还是在后台被杀,它假定用户想要返回他们中断的位置,因此ActivityManager重新启动该过程。

当你考虑它时,这适用于平台。首先,这正是当进程在后台被杀死并且用户返回它时发生的情况,因此需要在它停止的地方重新启动它。其次,当应用程序崩溃并呈现可怕的Force Close对话框时会发生这种情况。

说我希望我的用户能够拍照并上传。我从我的活动中启动了Camera Activity,并要求它返回一张图片。 Camera被推到我当前Task的顶部(而不是在自己的Task中创建)。如果相机出现错误并且崩溃,是否会导致整个应用程序崩溃?从用户的角度来看,只有相机失败,应该将它们返回到之前的活动。所以它只是重新启动进程,堆栈中的所有相同活动,减去相机。自从你的活动 应该 被设计成可以在帽子上被杀死和恢复,这应该不是问题。不幸的是,并非所有的应用程序都可以这样设计,所以它  对于我们许多人来说,无论Romain Guy或其他人告诉你什么,这都是个问题。因此,我们需要使用变通方法。

所以,我的结束意见:

  • 不要试图杀死这个过程。要么打电话 finish() 所有活动或电话 moveTaskToBack(true)
  • 如果您的进程崩溃或被杀死,并且如果像我一样,您需要内存中现在丢失的数据,则需要返回根活动。要做到这一点,你应该打电话 startActivity() 含有的Intent Intent.FLAG_ACTIVITY_CLEAR_TOP 旗。
  • 如果你想从Eclipse DDMS的角度杀死你的应用程序,最好不要在前台,否则它会重新启动。您应该先按Home键,然后按 然后 杀死这个过程。

280



实际上,自从我再次开始使用Android以来,我正在完成所有活动(在任何时间点只有一个活动处于活动状态),然后我调用System.exit(0);在我的服务中 - 这也是我想要的。我知道大多数人说“不要这样做”,但我完全按照我想要的行为...... - Ted
有时候杀死这个过程非常有用 - 例如在编写使用本机代码的游戏时。杀死进程意味着立即将所有已分配的内存释放回系统。 - Sulthan
对于任何关心的人,Process.killProcess演示与System.exit()完全相同的行为 - PacificSky
从常见的AtivityBase派生所有活动。然后按住一个标志强制关闭应用程序,在onResume中检查是否设置了force close标志。如果是这样,请调用System.exit(0);这将在整个活动堆栈中级联,最终完全关闭应用程序。 - Nar Gar
感谢您提供实际答案(moveTaskToBack() 是我正在寻找的)。很多人只是说“不,你是一个想要退出你的应用程序的白痴。”甚至没有考虑到可能存在你想要它的情况(例如登录失败)。 - Timmmm


我的所有应用程序都退出了按钮......我经常因为它而得到用户的积极评价。我不关心平台是否以应用程序不需要它们的方式设计。说“不要把它们放在那里”有点荒谬。如果用户想要退出...我向他们提供了完全相同的访问权限。我认为它根本不会减少Android的运行方式,而且似乎是一种很好的做法。我了解生命周期...我的观察是Android在处理它方面做得不好....这是一个基本事实。


168



+1,因为不幸的是,它在这个时间点做得不是很好(但我仍然想尝试按照设计做的事情,所以它让我陷入困境) - Richard Le Mesurier
你用什么机制戒烟? - Gary Rudolph
@Igor finish() - 活动不会杀死应用程序(扩展Application)。因此,即使没有任何活动处于活动状态,设置仍然是活动的和实际的,这样当活动尝试访问它们时,它们将是以前使用过的。 System.exit(0);另一方面,杀死应用程序,这样当再次启动时,应用程序将不得不重新初始化设置。这是我手动更新我的应用程序时所需要的,因为我经常更改数据的格式,我需要立即重新启动它们。 - Nar Gar
嗯,这是实现我目前所需要的唯一方法。我在更新应用程序时使用system.exit(否则我将根据代码更改获得序列化或类别转换异常)。我应该提一下,虽然我没有给用户一个UI句柄来通过system.exit来杀死应用程序 - 它是作为应用程序的工程师保留的,只有当应用程序绝对需要完全卸载时才能使用。其余时间使用简单的finish()(或默认的后退按钮操作)。 - Nar Gar
是啊..地狱与'不是android标准'.. Android是强大的coz,它使人们能够实验..如果它提供API做某事,怎么能说它不是Android标准?我无法消化所有那些“哲学”的答案。您使应用程序牢记您的用户。如果他们感到高兴或者他们想要看到这个特征,那么即使那些所谓的哲学家反对它,实施它也是绝对正确的。 - Rahul


不要将您的应用程序视为单一应用程序。它是一组用户可以与您的“应用程序”交互的UI屏幕,以及通过Android服务提供的“功能”。

不知道你的神秘应用“做什么”并不重要。让我们假设它隧道进入一些超级安全的企业内部网,执行一些监控或交互,并保持登录状态,直到用户“退出应用程序”。由于您的IT部门对其进行命令,因此用户必须非常清楚Intranet的IN或OUT。因此,您的心态对于用户“退出”非常重要。

这很简单。制作一项服务,在通知栏中发出持续通知,说“我在内联网,或者我正在运行”。让该服务执行您的应用程序所需的所有功能。拥有绑定到该服务的活动,以允许您的用户访问他们与您的“应用程序”交互所需的UI。并有一个Android菜单 - >退出(或注销,或其他)按钮,告诉服务退出,然后关闭活动本身。

对于所有意图和目的而言,这正是您所说的。完成Android方式。查看Google Talk或Google Maps Navigation,了解这种“退出”的可能性。唯一的区别是,在您的活动中按下后退按钮可能会让您的UNIX进程处于等待状态,以防用户想要恢复您的应用程序。这与在内存中缓存最近访问的文件的现代操作系统没有什么不同。退出Windows程序后,很可能它所需的资源仍在内存中,等待被其他资源替换,因为它们已被加载,因为它们已不再需要。 Android是一回事。

我真的没有看到你的问题。


134



这是咆哮背后的实际问题的答案。 - Julian Higginson
@Eric,你没有 看到 这个问题因为你正在逃避它。你只是利用 另一个 在旧的“程序模型”上运行的程序,以执行“Android模型”无法完成的操作。要查看“Android模型”的问题,您必须想象您没有将任务委派给Linux / Windows框的奢侈。你必须想象你被迫做 一切 从frontmostend到backmostend,只有运行“Android模型”的盒子。然后,你会看到“Android模型”的局限性如下 明确 如天空。 - Pacerier
将您的应用程序视为单一应用程序。它是用java编写的,由单个JVM(Java虚拟机)进程执行。 System.exit()退出JVM并完全完全终止所有UI屏幕和所有内容。例外情况是,如果程序员遇到设置多个线程的麻烦,这些线程在多个进程中运行 - 但默认情况下并非如此,并且根据Google的说法,不应该正常完成。 - Jesse Gordon
@JesseGordon这不是真的。 System.exit() 仅从堆栈中删除活动。 JVM立即重新初始化。看到 这个答案。 - forresthopkinsa
有趣的..看看你链接的答案,@ forresthopkinsa,看起来Android就像网页浏览器一样,在system.exit之后恢复活动,这样用户就不会注意到退出,但排除导致退出的活动。 。?奇怪的。但无论如何,System.exit() 不  关 所有活动和free()的内存并终止该应用程序的JVM。但我不知道Android在重启/恢复它时会做什么样的滑稽动作。是否可以阻止应用程序杀手级应用程序?所以我想如果有人想要一个退出按钮,他们应该把它放在主要活动中。 - Jesse Gordon


这是一次有趣且富有洞察力的讨论,有很多专家参与。我觉得这篇文章应该从Android开发主网站中回放,因为它确实围绕着Android操作系统的核心设计之一。

我还想在这里加两分钱。

到目前为止,我对Android处理生命周期事件的方式印象深刻,为本机应用程序带来了类似Web的体验概念。

话虽如此,我仍然相信应该有一个 放弃 按钮。为什么? ...不适合我或泰德或任何技术专家,但仅限于满足最终用户的需求。

虽然我不是Windows的忠实粉丝,但很久以前他们引入了一个大多数最终用户习惯的概念(一个X按钮)......“我想在'我想'时退出运行一个小部件。”

这并不意味着有人(操作系统,开发人员?)会根据自己的判断来处理这个问题......它只是意味着“我习惯的红色X按钮在哪里”。我的动作应该类似于“按下按钮时结束通话”,“按下按钮关闭设备”,等等......这是一种感知。我的行动确实达到了目的,这本身就令人满意。

即使开发人员可以使用此处给出的建议来欺骗这种行为,但仍然存在感知,即应用程序应该完全停止(最近)由最终用户按需提供的独立,可信和中立的源(OS)运行。


68



对。好的'Windows Mobile提供与Windows PC相同的X按钮,除了它实际上没有退出应用程序,它只是“智能最小化”它。许多用户可能从未发现应用程序没有真正退出。 (该方法效果很好,但如果您使用.NET Compact Framework,则不会通知应用程序已发生这种情况,因此无法选择释放资源或实际退出。) - Qwertie
真的,这相当于骗你的用户给他们一种温暖,模糊的感觉。最终,让过去的遗物落到路边会更好,以免它们继续成为技术的永久固定装置。移动和Web是新平台,预计其行为与桌面不同。而且至少,Android的生命周期决定似乎正在吸引用户:当我最大的应用程序通过其2周年纪念日时,我注意到最终用户请求“退出”按钮干涸,因为他们已经习惯了新平台。 - Jon O
@Jon你有什么推荐?在应用程序的任何位置都没有提供“退出”选项? - Igor Ganapolsky
好吧,当用户请求退出按钮时,我会向他们准确地解释事情与桌面上的工作方式不同(这与我们在提到任务杀手时给出的解释相同)。现在,信息似乎已经流行起来,我不再接受这些请求了。所以,我建议你解释一下(也许想出一个预制的响应)然后省略按钮。或者放入一个假的退出按钮,弹出一个对话框,解释为什么没有更多的退出按钮。 :D(同样在Android 4+中,用户可以在多任务显示屏上“关闭”以“杀死”它。) - Jon O
我也没有找到所有建议背后的理由说“不要杀死这个过程”。在我看来,客户永远是对的,所以在被要求提供退出按钮并且“向用户说谎给他们一种温暖,模糊的感觉”之后会出现什么问题,如果这就是他们想要的?这部分就是编写好的应用程序的全部内容。大多数用户不知道或不关心真正发生了什么,但如果他们喜欢你的应用程序并且它能够满足他们的需求和期望,他们就会回来购买更多应用程序。这就是我们都想要的,不是吗?或者我错过了什么? - DDSports


能够 退出,要么按下 背部 按钮或通过调用 finish() 在你的 Activity。打电话吧 finish() 从一个 MenuItem 如果你想明确杀掉它。

Romain并不是说它无法完成,只是它没有意义 - 用户不需要关心放弃或保存他们的工作或其他任何东西,因为应用程序生命周期的工作方式鼓励您编写自动保存和自动保存的智能软件无论发生什么,都要恢复它的状态。


35



如果它填满了一个目的,它就没有意义,而在我们的应用程序中,它就是这样做的。例如,我们想要在退出应用程序时检查更新。我们无法退出应用程序,然后无法进行更新。一些评论表明,按下后退按钮并不会杀死应用程序(请参阅上面的问题中的链接)。 - Ted
另一件事是我不希望应用程序只需按下BACK按钮即可退出。它应该只在用户想要终止它时终止 - 从来没有任何其他方式。如果你不能编写类似于Android的应用程序,那么我认为android不能用于编写真正的应用程序=( - Ted
正如Romain所说,并不是核心应用程序的工作方式。因此,如果用户习惯按“退回”退出应用程序,那么他们似乎可以继续使用您的应用程序而不是明确选择退出?您可以在启动时进行更新检查,或者使用onDestroy(),或者使用重复警报..它似乎不需要由用户触发。 - Christopher Orr
你必须记住Android不是PC - 它是一部手机。它具有有限的资源和用户需要完全控制的需求(例如,发出紧急呼叫)。 “真正的应用程序”是什么意思? - Tom R
该应用程序做什么?如果您不想在用户点击时退出,请使用服务。如果您确实希望它退出,为什么还要关心活动是否仍在内存中?为什么要在退出时更新软件?市场应用程序负责为您更新软件。 - Jay Askren


这场辩论归结为一个古老的问题,即开发人员是最了解还是用户最了解。人类因素的所有领域的专业设计师每天都在努力解决这个问题。

Ted指出,市场上下载次数最多的应用之一就是“App Killer”。当人们退出申请时,人们会得到一些额外的血清素。他们已经习惯了桌面/笔记本电脑。它可以让事情快速发展。它可以使处理器保持冷却并且风扇不会打开。它耗电量更少。

当你认为移动设备是一个小得多的船,那么你可以特别欣赏他们“抛弃你不再需要的东西”的动机。现在,Android的开发人员已经推断操作系统最了解并且退出应用程序是古董。我全心全意地支持这一点。

但是,我也相信你不应该挫败用户,即使这种挫败感是出于他们自己的无知。因此,我得出结论,“退出”选项是一个很好的设计,即使它主要是一个安慰剂按钮,只能关闭视图。


31



是的,有一个'退出'按钮确实是用户友好的。如果用户是5个深入活动,用户还会如何退出应用程序?当然,他们可以多次按下,但我不认为他们会这样。 - Igor Ganapolsky
只有5? Android 2.2网络浏览器让我花几分钟点击后退按钮,直到我最终退出 - Joe Plante
当他们开发WORKS的内存管理器时,我会开始听android的开发人员。截至Froyo,它工作得非常糟糕,杀掉随机应用程序,重新启动不需要的应用程序(并且没有Intents合法地启动它们),以及OTOH,当内存达到50MB空闲时,减速到完全爬行。 - DVK
当你的宗教信仰说Android任务杀手是“不必要的”,但使用ATK杀死没有业务运行的愚蠢任务会改变操作系统从正常速度的~1-5%爬回到正常速度的100%(测量)每当系统达到50MB免费低端时,超过2年的100次ATK使用的100%时间, 你的宗教错了 - DVK
这些测量在哪里 - Chad Hedgcock


特德,你想要完成的事情可能已经完成,也许不是你现在如何思考它。

我建议你阅读活动和服务。停止使用术语“app”并开始引用组件,即Activity,Service。我想您只需要了解有关Android平台的更多信息;它是标准PC应用程序的思维方式的变化。事实上,你的帖子中没有任何帖子中有“活动”(缺少常见问题解答引用,即不是你的话),这告诉我你需要阅读更多内容。


28



我已经阅读了android.com上的大部分内容=)我可以链接到我谈论活动的几个问题,所以那不是真的(例如: stackoverflow.com/questions/2032335/... 要么 stackoverflow.com/questions/2032335/... 等...)但是,我可能最后一次,并尝试创建谁“应用程序”作为服务... - Ted
一个应用程序可以包含服务和活动,听起来你的应用程序可能需要两者。活动仅是UI部分。 - Aaron


博客文章 何时在Android应用程序中包含退出按钮(提示:从不) 解释得很远,  比我更好。我希望每个Android开发人员都已经阅读过它。

摘录:

根据我的经验,[用户]真正想要的是:    一种明确的方法来保证应用程序将停止消耗资源(电池,CPU周期,数据传输等)。

许多用户认为退出按钮实现了这一要求   并要求添加它。开发人员,希望取悦他们的用户,   有意添加一个。此后不久,他们都失败了。

  • 在大多数情况下,退出按钮只是调用 Activity.finish()。这是 究竟 相当于按下后退按钮。    究竟。    服务继续运行和轮询不断发生。用户可能会认为他们已经杀了应用程序,但很快就没有   他们会更加恼火。
  • 退出行为现在不明确。您的退出按钮是应该关闭活动,还是应该还停止所有关联的服务,接收器和警报?什么应该 背部 做?如果他们击中会发生什么  代替?如果您的应用有小部件,会发生什么?退出按钮是否应该停止更新?

解决方案是使后退按钮的行为符合您的预期   退出按钮。更好的是,只需停止消耗资源   该应用程序不可见。

继续阅读完整的文章。


23



退出和返回并不总是用于相同的目的。以潘多拉为例。当你回来退出这个应用程序时,它不会退出应用程序(让它在后台作为服务播放)。 - Igor Ganapolsky
@IgorG。音乐播放器应用程序需要“停止”按钮才能停止播放音乐,而不是“退出”按钮退出应用程序。 - Dheeraj V.S.
您曾经使用过Pandora,iHeartRadio,Spotify,Jango和其他音乐流媒体应用吗?他们都有一个退出按钮。停止音乐播放与退出应用程序不一样。特别是如果您在通知栏中运行了服务。 - Igor Ganapolsky
神话与否,原始用户与否,但几乎所有在任何平台和操作系统上编写的UI软件都实现了退出/关闭/退出按钮。你怎么会实现它? - Igor Ganapolsky
@ DheerajV.S。,只要应用程序不可见,只需停止消耗资源? 不好的建议。  非常。  非常x99。 每当我尝试通过电子邮件向自己发送照片时,我必须让应用程序保持整整5分钟,因为如果我将其最小化,它就会停止通过电子邮件发送照片。正确,我不能使用我的手机整整5分钟只是因为一些开发人员认为应用程序应该只在可见时运行。现在想象发送一个像视频一样的大文件...... - Pacerier


我认为重点是除非你有错误的软件,否则不需要退出应用程序。 Android在用户未使用时退出应用程序,并且设备需要更多内存。如果您的应用需要在后台运行服务,您可能需要一种方法来关闭服务。

例如,当应用程序不可见时,Google Listen会继续播放播客。但是当用户完成播放时,总会有暂停按钮关闭播客。如果我没记错,Listen,甚至会在通知栏中放置一个快捷方式,这样您就可以快速进入暂停按钮。另一个例子是像Twitter应用程序这样的应用程序,它不断轮询互联网上的服务。这些类型的应用程序应该真正允许用户选择轮询服务器的频率,或者甚至是否在后台线程中轮询。

如果需要在退出时运行代码,可以根据需要覆盖onPause(),onStop()或onDestroy()。 http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle


19



除了我发现的其他混乱的东西,我认为开发我们的Android应用程序是不会发生的。它太多的“大哥” - 正在发生的事情,Android告诉我应该运行什么应用程序。我作为程序员应该有这个选择,而不是google或android =( - Ted
您的活动 - 活动用户界面 - 当另一个应用程序出现在您的顶部时,或者您按下或等等。用户不与他们交互,因此最安全的是保存状态以防用户长时间不回来,等等,如您所知。什么都没有阻止你写一个 Service 虽然要在后台继续进行工作,比如接收数据推送等等。当您使用其他应用时,Google Talk不会停止工作。与音乐播放器相同。看看那里的其他应用程序以及它们如何工作。 - Christopher Orr
您应该能够保存凭据,这样用户无需在每次拨打电话或离开应用程序时都登录。我建议看一下Android的生命周期。当应用程序暂停,停止或销毁时,您可以保存所有相关数据,这样当应用再次打开时,它就会像他们离开时一样。用户甚至不需要知道应用程序曾被停止过。 - Jay Askren
我可以想象用户可能想要退出一些资源密集型应用程序。也许它应该在暂停时减少资源的使用,但这可能并不总是可行的 - Casebash
这个问题仍然存在,我看到了,4年后我提出来了=)我确实在后台运行它作为服务,但我添加了退出按钮,因为我仍然觉得 - 4年后 - 这是必要的而且很重要。而且我看到越来越多的应用程序也有这种情况(例如Skype)。 - Ted


如果您无法理解如何使您的数据/连接(以及您的“应用程序”)持续存在,那么您将无法完成Android所需的操作。

那些下载那些可爱的小App Killers的人通常会发现他们没有帮助电池寿命或内存使用,但阻碍了操作系统有效管理内存的工作......

http://android-developers.blogspot.com/2010/04/multitasking-android-way.html


19



当我们谈论任务杀手时,几天前Android reddit上出现了一个很有启发性的帖子。要点是,小心使用任务杀手,否则你最终可能会损害你的电池续航时间: reddit.com/r/Android/comments/cwhm6/... - Neil Traft
@Neil Traft,我发现帖子上的评论很有启发性。商店的销售代表正在为他们的客户推荐和安装任务杀手:) - dipu
@Dan,如果我完全退出我已经完成一周的应用程序阻止Android操作系统的工作,我甚至可以远程实现这一目标?所以有更多的免费记忆。这不可能阻碍android!不过,它确实可以在以后加快速度!如果我知道我已经完成了应用程序一段时间,它绝对没有任何意义。它只占用内存,迟早,我会推出一个新的应用程序,操作系统将有一个额外的延迟,因为它必须杀死一些我知道WEEKS之前我完成的应用程序。 - Jesse Gordon
@Jesse Gordon,您是否在杀死应用程序后看到了实际进程?它们重新启动,操作系统假设存在问题......操作系统会在需要内存时终止应用程序。你有没有读过这里提到的文章中发表的任何内容? - Dan
@Dan,认为Android会做这样的事情......它真的需要一些严肃的白洗再培训。 - Pacerier