这是在Stackoverflow的关于 “终止安卓应用程序” 的经典问答。
很好的阐释了为何安卓系统不提供终止应用程序的选项。
将此文翻译并分享下。
问:by Ted
在我尝试学习 Android 的过程中,我刚读到以下内容:
问:如果我们不设置菜单选项来终止应用程序,用户是否可以选择终止应用程序?如果没有这样的选项存在,用户如何终止应用程序?
答:(罗曼·盖伊):用户不可以选择,系统会自动处理。这就是活动生命周期(尤其是onPause/onStop/onDestroy)存在的原因。不管您做什么,不要设置 "quit" 或 "exit" 应用程序按钮。这对 Android 应用模式没有用,同时也违背核心应用的工作原理。
呵呵,我在 Android 世界每走一步,就会遇到某种问题
很显然,您不能在 Android 里退出应用程序(但当 Android 系统想这样做时,可以很好地完全摧毁您的应用程序)。这是怎么回事?我开始想写一个功能如同”正常应用” (如果用户决定这样做,他/她可以退出应用程序)的应用程序是不可能的。那不是应该依赖操作系统去做的事情。
我试图创建的应用程序不是为了安卓市场 (Android Market) 。它不是为了公众“广泛使用”的应用程序,它是一个将在很窄的商业领域被使用的应用程序。
我其实真的很期待为 Android 平台开发,因为它解决了很多存在于 Windows Mobile 和 .NET. 的问题。然而,上周的事情让我有点受挫……我希望我不必因此放弃 Android,但现在看起来并不是很好
有没有一种办法让我真的退出应用程序?
答:by Commonswave
最终回到您的问题,但我首先要解决您在我的这篇文章之前针对各种回答的评论里提出的问题。我无意改变您的主意 - 更确切地说,这些观点是为了将来能够阅读到此文的其他人。
问题的关键是,我不能让 Android 的决定何时我的应用程序将被终止。这必须是用户的选择。
数以百万计的人们对运行环境根据需要关闭应用程序的模式非常满意。那些用户根本不会去想“终止” Android 应用程序,至多他们会想“终止”网页或“终止”恒温器。
iPhone 用户大致是以相同的方式,按下 iPhone 的按钮并不一定“感觉”应用程序被终止,因为许多 iPhone 应用程序当用户离开时还是运行,即使应用程序真得被关闭(因为 iPhone 当前一次只允许一个第三方应用程序运行)。
正如我前面所说,在我的应用程序内发生很多状况(被推向设备的数据,总是应该在那里的任务清单等等)。
我不知道什么是“应该在那里的任务清单”,但“被推向设备的数据”是一个令人愉快的虚构,不应该在任何情况下由一个活动来完成。使用计划任务(通过 AlarmManager)来更新您的数据以获得最大可靠性。
我们的登录用户,每次他们接电话时,总会遇到 Android 终止应用程序的情形。
解决此问题的 iPhone 和 Android 的应用程序有很多。通常情况下,因为他们持有登录证书,所以不是强迫用户每次都手动登录。
例如,我们想在退出应用程序时检查更新
这是在任何操作系统上都发生的错误。正如您所知道的那样,您的应用程序“退出”的原因是因为操作系统正在关闭,然后您的更新将半途而废。一般来说,这不是一件好事。可以再开机时检查更新或完全异步地检查更新(例如,通过计划任务),绝对不要在退出时检查。
有些意见认为,点击后退按钮根本没有终止应用程序(见上面我的问题链接)。
按 BACK 按钮并没有“终止应用程序”。当用户按下 BACK 按钮时,屏幕上的活动终止。
只有当用户想终止应用程序才可以终止,绝不是任何其他方式。如果您能写跟 Android 系统内一样的应用程序,那么我想 android 可以被用于写真正的应用程序
如果我对他们的模型理解正确的话(还没有机会尝试任何一个),无论是网页应用或是网络操作系统都不能做到。所有这些,用户没有“终止”任何事情 - 他们只是离开。 iPhone 有点不同,因为它目前只允许一次运行一个应用(只有少数例外),所以离开意味着立即终止应用程序。
有没有一种办法让我真的退出应用程序?
正如其他人告诉您的,用户(通过 BACK)或您的代码(通过 finish())可以关闭您当前正在运行的活动。对于妥善编写的应用程序,用户一般不需要别的东西,至多使用网页应用程序时需要一个“退出”选项。
按照定义,没有两个应用程序环境是相同的。这意味着,随着新环境出现,其他环境消亡,您可以看到环境中的趋势。
例如,有一个试图消除“文件”概念的发展中的运动。大多数网络应用程序不强迫用户去考虑文件。 iPhone 应用程序通常不强迫用户去考虑文件。Android 应用程序一般不强迫用户去考虑文件。等等。
同样地,有一个试图消除“终止”概念的发展中的运动。大多数网络应用程序不强制用户登出,而是当应用空闲一段时间后,用户会自动登出。Android 是这样,在更小程度上,iPhone(以及可能的网络操作系统)也是这样。
这就需要更加注重应用设计,专注于业务目标,而不是坚持与以前的应用程序环境相关联的实施模型。缺少时间或意愿的开发者会对突破他们现有的思维模式的较新的环境感到沮丧。这不是任何环境的错,仅仅是风暴绕过大山而不是穿越大山的问题。
例如,一些开发环境,如 Hypercard 和 Smalltalk,将应用程序和开发工具混在一个设定里。这个概念在应用程序语言扩展(例如,Excel 中的 VBA、AutoCAD 中的 LISP)以外,并不是很流行。想出假定应用程序内开发工具存在的思维模式的开发者,因此,要么不得不改变他们的模型,或限制他们自己到他们模型适用的环境中。
所以,当您写到:
随着我发现的其他的乱七八糟的东西,我认为为 Android 开发我们的应用程序是不会发生的。
这似乎对于您,对于现在来说是最好的。同样地,我会劝您不要试图将您的应用程序转到网页上,因为一些您报告的有关 Android 的同样问题,您在网页应用程序内也会发现(例如,没有“终止”)。或反过来说,如果有一天您转应用程序到网页上,您可能会发现网页应用程序的流程可能对
Android 匹配得更好,您可以在那时重新访问 Android 端口。
此文在CC-By-SA 3.0许可证下使用