退出应用程序会感到皱眉吗?

继续尝试学习 Android,我读了以下内容

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

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

呵呵,我进入 Android 世界的每一步都会遇到某种问题 =(

显然,您无法在 Android 中退出应用程序(但是 Android 系统可以在需要时完全销毁您的应用程序)。那是怎么回事?我开始认为编写一个充当 “普通应用程序” 的应用程序是不可能的 - 用户可以在决定退出应用程序时退出该应用程序。那不是应该依靠操作系统来做的事情。

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

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

我有办法真正退出该应用程序吗?

答案

这最终将解决您的问题,但是我首先想解决您在撰写本文时已经给出的各种答案的各种评论中提出的一些问题。我无意改变您的想法 - 相反,这些是供将来阅读此帖子的其他人使用的。

关键是我不能允许 Android 确定何时终止我的应用。那必须是用户的选择。

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

iPhone 用户的使用方式大致相同,因为按下 iPhone 按钮并不一定像终止应用程序一样 “感觉”,因为许多 iPhone 应用程序从用户离开的地方接起,即使该应用程序确实关闭了(因为仅 iPhone)目前一次允许一个第三方应用)。

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

我不知道 “列出应该始终存在的任务” 是什么意思,但是 “将数据推送到设备上” 是一种令人愉快的小说,无论如何都不应该由活动来完成。使用计划的任务(通过AlarmManager )来更新您的数据以获得最大的可靠性。

我们的用户每次登录都会登录,并且不能这样做,而 Android 决定终止该应用程序。

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

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

在任何操作系统上,这都是一个错误。就您所知,您的应用程序 “退出” 的原因是因为操作系统正在关闭,然后您的更新过程中途会失败。通常,这不是一件好事。要么在启动时检查更新,要么完全异步地检查更新(例如,通过计划的任务),而从不退出。

一些评论表明,单击 “后退” 按钮根本不会杀死该应用程序(请参阅上面我的问题的链接)。

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

仅当用户想要终止它时才终止它 - 决不能以其他方式终止。如果您无法编写与 Android 一样的应用程序,那么我认为 Android 不能用于编写真实的应用程序 =(

然后,Web 应用程序也不能。或WebOS ,如果我正确理解了他们的模型(还没有机会玩过)。在所有这些情况下,用户都不会 “终止” 任何东西 - 他们只是离开。 iPhone 有点不同,它目前仅允许一次运行一次(有一些例外情况),因此离开行为意味着该应用程序将立即终止。

我有办法真正退出该应用程序吗?

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


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

例如,试图消除 “文件” 概念的运动正在发展。大多数 Web 应用程序都不强迫用户考虑文件。 iPhone 应用程序通常不会强迫用户考虑文件。 Android 应用程序通常不会强迫用户考虑文件。等等。

类似地,试图消除 “终止” 应用程序的想法的运动也越来越多。大多数 Web 应用程序并不强迫用户注销,而是在一段时间不活动之后隐式注销用户。与 Android 相同,在较小程度上与 iPhone(可能还有 WebOS)相同。

这就需要更加强调应用程序设计,关注业务目标,而不是坚持与先前的应用程序环境绑定的实现模型。缺乏时间或意愿去做的开发人员会因新环境破坏了他们现有的思维模式而感到沮丧。这不是这两种环境的错,更不是因为山峰绕过而不是通过风暴而造成的故障。

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

所以,当你写:

连同我发现的其他混乱情况一样,我认为开发针对 Android 的应用程序不会发生。

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

我只想在此为该线程的未来读者添加一个更正。这种特殊的细微差别使我的理解早已久,因此我想确保你们没有一个犯同样的错误:

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

简短的答案是,如果您要退出应用程序,则必须跟踪堆栈中的所有活动,并在用户想要退出时对它们进行finish()所有操作(而且,没有办法进行遍历)活动堆栈,因此您必须自己管理所有这些)。即使这实际上并没有杀死进程或您可能拥有的任何悬挂引用。它只是完成了活动。另外,我不确定Process.killProcess(Process.myPid())是否更好。我还没有测试。

另一方面,如果可以将活动保留在堆栈中,则可以使用另一种方法使事情变得超级简单: Activity.moveTaskToBack(true)将仅使您的进程后台并显示主屏幕。

长答案包括对这种行为背后的哲学的解释。该哲学是基于许多假设而产生的:

  1. 首先,仅当您的应用程序位于前台时才会发生这种情况。如果它在后台,则该过程将终止。但是,如果它在前台,则 OS 会假定用户希望继续做他 / 她正在做的事情。 (如果您尝试从 DDMS 中终止该进程,则应先单击 “主页” 按钮,然后再终止它)
  2. 它还假定每个活动都独立于所有其他活动。这通常是正确的,例如,在您的应用启动浏览器活动的情况下,该活动是完全独立的,不是您编写的。浏览器活动可能会或可能不会在同一任务上创建,具体取决于其清单属性。
  3. 它假定您的每项活动都是完全自力更生的,并且可以在瞬间通知您被杀死 / 恢复。 (我不喜欢这个特殊的假设,因为我的应用程序有很多活动依赖大量缓存的数据,而这些数据太大,无法在onSaveInstanceState期间有效地进行序列化,但是 whaddya 会这样做吗?)对于大多数编写良好的 Android 应用程序,这应该是正确的,因为您永远不知道您的应用何时会在后台终止。
  4. 最终的因素并不仅仅是一个假设,而是操作系统的局限性: 明确杀死应用程序与崩溃应用程序相同,也与 Android 杀死应用程序以回收内存相同。这最终以我们的妙招达到顶峰:由于 Android 无法判断应用程序是否退出,崩溃或在后台被杀死,因此它假定用户想要返回他们上次退出的位置,因此 ActivityManager 重新启动该过程。

考虑一下时,它适合该平台。首先,当进程在后台被终止并且用户返回该进程时,这正是发生的情况,因此需要在中断处重新启动它。其次,当应用程序崩溃并显示可怕的 “强制关闭” 对话框时,会发生这种情况。

假设我希望我的用户能够拍照并上传照片。我从我的活动中启动 “相机活动”,并要求其返回图像。相机被推到我当前任务的顶部(而不是在自己的任务中创建)。如果相机出现错误并崩溃,是否应该导致整个应用崩溃?从用户的角度来看,只有 “相机” 发生故障,应该将其返回到先前的活动。因此,它将使用堆栈中所有相同的活动(不包括 Camera)重新启动该过程。由于您的活动应该经过精心设计,以便可以一口气将其杀死并恢复,因此这不成问题。不幸的是,并非所有应用程序都可以采用这种方式设计,因此,无论罗曼 · 盖伊(Romain Guy)或其他人告诉您什么,这对我们许多人来说都是一个问题。因此,我们需要使用解决方法。

因此,我的总结建议:

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

我所有的应用程序都有退出按钮…… 因此,我经常得到用户的积极评价。我不在乎该平台的设计是否使应用程序不需要它们。说 “不要把它们放在那里” 有点荒谬。如果用户要退出... 我可以为他们提供访问权限,以实现此目的。我认为它完全不会降低 Android 的运行方式,这似乎是个好习惯。我了解生命周期... 并且我观察到 Android 在处理它方面做得不好.... 这是一个基本事实。

停止将您的应用程序视为整体应用程序。这是一组 UI 屏幕,用户可以与您的 “应用程序” 以及通过 Android 服务提供的 “功能” 进行交互。

不知道您的神秘应用程序的 “用途” 并不是很重要。假设它通过隧道进入一些超级安全的公司 Intranet,执行一些监视或交互,并保持登录状态,直到用户 “退出应用程序” 为止。由于您的 IT 部门负责命令,因此用户必须非常注意何时进入或退出 Intranet。因此,您的思维定式对于用户 “退出” 很重要。

这很简单。进行一项服务,以将正在进行的通知放在通知栏中,提示 “我在 Intranet 中,或者我正在运行”。让该服务执行您的应用程序所需的所有功能。具有绑定到该服务的活动,以允许您的用户访问与 “应用程序” 进行交互所需的部分 UI。并有一个 Android 菜单 -> 退出(或注销,或其他方式)按钮,告知服务退出,然后关闭活动本身。

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

我真的没看到你的问题。

这是一个有趣而有见地的讨论,许多专家参与其中。我觉得这篇文章应该在 Android 开发主网站上回圈,因为它确实围绕 Android OS 的核心设计之一展开。

我还要在这里加两分钱。

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

话虽如此,我仍然认为应该有一个退出按钮。为什么? ... 不适合我或 Ted 或此处的任何技术专家,而仅是为了满足最终用户的需求。

尽管我不是 Windows 的忠实拥护者,但很久以前,他们引入了一个概念,即大多数最终用户都习惯了(X 按钮)...“我想在需要时退出运行小部件”。

这并不意味着某人(操作系统,开发人员?)将自行决定处理此事…… 只是表示 “我习惯使用的 Red X 按钮在哪里”。我的动作应该类似于 “按下按钮结束通话”,“通过按下按钮关闭设备” 等等,依此类推…… 这是一种感知。本身令我满意的是,我的行动确实达到了目的。

即使开发人员可以使用此处给出的建议来欺骗这种行为,但这种感觉仍然存在,即应用程序应根据最终用户的要求通过独立,受信任的中立来源(OS)完全停止运行(现在)。

可以通过按Back按钮或在Activity调用finish()退出。如果要显式杀死它,只需从MenuItem调用finish()即可。

Romain 并不是说不可能做到这一点,只是说这是没有意义的–用户无需担心退出或保存他们的工作或其他事情,因为应用程序生命周期的工作方式鼓励您编写可以自动保存和保存信息的智能软件。无论发生什么情况,都可以恢复其状态。

这场争论归结为一个古老的问题,即开发人员是否最了解或用户是否最了解。人为因素各个领域的专业设计师每天都在为此奋斗。

Ted 指出,市场上下载次数最多的应用之一是 “App Killer”。人们在退出申请时会获得一些额外的 5 - 羟色胺。他们已经习惯了台式机 / 笔记本电脑。它使事情保持快速发展。它可以使处理器保持凉爽,并保持风扇无法打开。耗电量少。

当您认为移动设备是一艘小得多的船时,您可以特别欣赏他们的动力,那就是 “抛弃您不再需要的东西”。现在,Android 开发人员已经推理出该操作系统最了解并且退出应用程序是过时的。我全力支持。

但是,我也相信您不应该让用户感到沮丧,即使这种沮丧是出于他们自身的无知。因此,我得出的结论是,拥有 “退出” 选项是一种好的设计,即使它主要是一个安慰剂按钮,除了关闭视图外也无济于事。

泰德(Ted),您想完成的事情可以完成,也许只是您现在的想法不行。

我建议您阅读 “活动和服务”。停止使用术语 “应用程序”,并开始引用组件,即活动,服务。我认为您只需要了解有关 Android 平台的更多信息;与标准 PC 应用程序相比,这是一种观念上的变化。您的帖子中都没有一个单词 “Activity”(缺少 FAQ 引用,即没有您的单词)的事实,这告诉我您需要阅读更多内容。

博客文章何时在 Android Apps 中包含退出按钮(提示:从不)对它的解释远比我能做到的好得多。我希望每个 Android 开发人员都已经阅读过。

摘录:

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

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

  • 在大多数情况下,退出按钮只是调用Activity.finish() 。这完全等同于单击 “后退” 按钮。 究竟。服务保持运行,并且轮询不断发生。用户可能会认为自己已经杀死了该应用程序,但实际上并没有杀死它们,很快他们就会更加恼火。
  • 退出行为现在不明确。您的退出按钮应该只是关闭活动,还是应该停止所有相关的服务,接收器和警报? Back应该怎么做?如果他们改为回家,会发生什么?如果您的应用程序有一个小部件会怎样?退出按钮是否也应该阻止它更新?

解决方案是使后退按钮的行为与您期望退出按钮的行为相同。更好的是,只要看不见该应用程序,就停止消耗资源。

继续阅读完整的文章。

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

1:完全退出应用程序通常是强制性的,但这并不是没有用的。如果 Windows 没有退出选项怎么办?由于内存已满,并且操作系统必须猜测使用了哪些程序,因此系统运行缓慢。我不在乎 Romain Guy 甚至 Larry Page 和 Sergey Brin 怎么说,这些都是无可置疑的事实:当启动新应用程序之前,系统必须杀死任务以获取内存时,系统运行速度较慢。您只是无法告诉我,不需要花费时间就可以杀死应用!甚至来自遥远恒星的光需要时间...。在允许用户完全关闭一些应用程序使用。

2:与核心应用程序的工作方式相反?那是什么意思?当我现在完成一个应用程序的运行时,它不再做任何工作…… 只是在需要内存时等待被操作系统杀死。

总而言之,最小化和退出之间有明显的区别,并且两者都不会碰到对方。我们是否在每个螺丝钉中都留下了螺丝刀?还是每扇门的钥匙?我们是否将所有设备都保持高位,直到断路器烧断并且需要打开另一台设备?我们是否在洗碗机中放满了餐具,每次只拿出足够的空间来腾出一些新的脏东西?我们是否让所有汽车都在车道上行驶,直到 - 哦,没关系。

如果用户想最小化一个应用程序,那么最好的办法就是最小化它。如果用户要退出应用程序,则最好退出。

皱眉吗?这是 Android 的观点 - 他们对此并不满意。许多独立的新秀 Android 开发人员对此并不满意。

但是当涉及到它时,就会出现好的编码和不好的编码。有好的程序流程模型,有好的程序流程模型。

当用户仅知道程序已完成时,将程序留在内存中并不是很好的程序流程。它绝对毫无用处,并且在启动新应用程序或运行应用程序分配更多内存时会减慢速度。

这有点像您的汽车:有时您会使其保持运行状态,例如在停车灯处停车,或者快餐店驶过,或者在 ATM 上停车。但是在其他情况下,您确实想关闭它 - 例如上班,杂货店甚至是家中。

同样,如果您正在玩游戏并且手机响了,可以。暂停游戏并使其继续运行。但是,如果用户在一段时间内完成游戏,那么一定要让他们退出。

某些应用程序上的退出按钮应该比其他应用程序更靠前。例如,游戏或用户可能希望完全退出的程序应该具有明显的退出。其他程序,例如电子邮件程序,希望退出是不太可能的(这样它就可以继续检查电子邮件)- 这些程序不应通过退出选项浪费主控制输入屏幕空间,但是为了获得良好的程序流程,应该有一个退出选项。如果有人认为自己不希望邮件程序在覆盖范围较差,或者在 Skype 通话中或其他情况下尝试检查电子邮件怎么办?如果他们愿意,让他们退出电子邮件程序!

暂停和退出是两项至关重要的任务,两者都不能发挥另一个作用。