正在放弃申请吗?

在我学习Android的尝试中,我刚刚阅读了以下内容:

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

答案:(罗曼盖伊):用户没有,系统自动处理这个。 这就是活动生命周期(特别是onPause / onStop / onDestroy)的用途。 无论您做什么,都不要放置“退出”或“退出”应用程序按钮。 这对于Android的应用程序模型来说是没用的。 这也与核心应用程序的工作方式相反。

嘿嘿,我在Android世界的每一步都遇到了一些问题=(

显然,你不能在Android中退出应用程序(但Android系统可以很好地彻底销毁你的应用程序,只要它感觉像)。 那是怎么回事? 我开始认为编写一个功能像“普通应用程序”的应用程序是不可能的 - 用户可以在他/她决定这样做时退出应用程序。 这不是应该依赖于操作系统的事情。

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

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

有没有办法让我真的退出应用程序?


这最终会解决您的问题,但我首先要解决您在各种评论中提出的许多问题,以解决撰写本文时已提供的各种答案。 我无意改变主意 - 相反,这些对于未来阅读这篇文章的其他人来说也是如此。

关键是我不能让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同样的东西,在较小的程度上,iPhone(可能还有WebOS)。

这需要更多地强调应用程序设计,专注于业务目标,而不是坚持与以前的应用程序环境绑定的实现模型。 缺乏时间或倾向去做这件事的开发人员会因为破坏现有心智模型的新环境而感到沮丧。 这不是任何一种环境的缺点,它不仅仅是风暴在周围环绕而不是通过它的山峰的错。

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

所以,当你写:

除了我发现的其他杂乱的东西,我认为开发适用于Android的应用程序不会发生。

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


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

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

简短的回答是,如果你想退出你的应用程序,你必须跟踪堆栈中的所有活动,并在用户想要退出时finish()所有这些活动(并且不可以,无法迭代活动堆栈,所以你必须自己管理所有这些)。 即使这并没有真正杀死这个进程或任何你可能有的悬挂引用。 它只是完成了活动。 另外,我不确定Process.killProcess(Process.myPid())是否可以更好地工作。 我没有测试过它。

另一方面,如果您的活动仍然在您的堆栈中仍然存在,还有另一种方法可以使您的工作变得非常简单: Activity.moveTaskToBack(true)仅会简化后台进程并显示主屏幕。

漫长的回答涉及对这种行为背后的哲学的解释。 这一哲学诞生于许多假设:

  • 首先,这只发生在你的应用程序处于前台时。 如果它在后台,该进程将会终止。 但是,如果它在前台,操作系统会假定用户想要继续做他/她正在做的事情。 (如果你试图从DDMS中杀死进程,你应该首先点击主页按钮,然后杀死它)
  • 它还假定每项活动都独立于所有其他活动。 这通常是正确的,例如在您的应用程序启动浏览器活动的情况下,该活动完全独立并且不是由您编写的。 浏览器活动可能会或可能不会在同一个任务上创建,具体取决于其清单属性。
  • 它假定你的每一项活动都是完全自力更生的,并且可以立即通知被杀死/恢复。 (我宁愿不喜欢这个特定的假设,因为我的应用程序有很多依赖大量缓存数据的活动,太大而无法在onSaveInstanceState期间有效地序列化,但是whaddya会这样做?)对于大多数写得很好的Android应用程序,这应该是真实的,因为你永远不知道你的应用何时会在后台被杀掉。
  • 最后一个因素并不是一个假设,而是操作系统的一个限制:明确杀死应用程序与应用程序崩溃相同,也与Android杀死应用程序以回收内存一样。 这最终导致我们的coup de grace:由于Android无法确定应用程序是在后台退出,崩溃还是被杀死,它假定用户想要返回他们离开的位置,因此ActivityManager重新启动该进程。
  • 当你考虑这个问题时,这对平台是适合的。 首先,这正是当进程在后台被终止并且用户返回时发生的情况,所以需要在停止的地方重新启动。 其次,这是应用程序崩溃并显示可怕的强制关闭对话框时发生的情况。

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

    所以,我最后的建议是:

  • 不要试图杀死这个过程。 在所有活动上调用finish()或调用moveTaskToBack(true)
  • 如果你的进程崩溃或被杀,并且如果像我一样,你需要内存中现在丢失的数据,则需要返回到根活动。 为此,您应该使用包含Intent.FLAG_ACTIVITY_CLEAR_TOP标志的Intent调用startActivity()
  • 如果你想从Eclipse DDMS的角度杀死你的应用程序,最好不要在前台,否则它会重新启动。 您应该首先按下主页按钮,然后终止该过程。

  • 我的所有应用程序都退出了按钮......我经常从用户那里得到积极的评论。 我不在乎平台的设计是否应用程序不需要它们。 说“不要把它们放在那里”有点荒谬。 如果用户想要退出......我向他们提供访问来做到这一点。 我不认为这会降低Android的运作方式,似乎是一种很好的做法。 我了解生命周期......我的观察一直认为,Android在处理它方面做得并不好......这是一个基本事实。

    链接地址: http://www.djcxy.com/p/16121.html

    上一篇: Is quitting an application frowned upon?

    下一篇: How can you get the Manifest Version number from the App's (Layout) XML variables?