【问题标题】:Why don't Android and iOS kill the process when the app is closed?为什么Android和iOS在应用关闭时不杀死进程?
【发布时间】:2019-04-16 06:21:27
【问题描述】:
在 Windows、MacOS 和 Linux 上,当应用程序关闭时,其进程也会被终止。这在 Windows/Linux 和 MacOS 上是默认发生的,在没有打开应用程序窗口时按 CMD+Q 终止进程似乎仍然是个好主意。
在 Android(和 iOS)上,当应用程序在后台运行时,它的进程仍然存在于内存中,直到操作系统发现有必要将其推出。该进程可以被终止,但此步骤不是默认的操作系统行为,并且在某种程度上被 UX 劝阻。
为什么?
更新
一些回复似乎确实表明将应用程序保留在内存中具有潜在的好处。因此,进一步的跟进将是,为什么主流桌面操作系统不遵循相同的方法来获得所有相同的好处?
【问题讨论】:
标签:
android
ios
mobile
memory-management
【解决方案1】:
Android 非常擅长管理其资源。它有一定数量的内存 (RAM) 可供使用,并且很乐意让应用尽可能多地使用它们以获得最佳性能。
如果 RAM 开始变得有点不足,而其他应用程序和任务需要一些,那么操作系统会悄悄关闭在后台运行且您有一段时间未使用的应用程序,并将该应用程序的 RAM 分配给新任务。
因此,自您上次使用以来,应用程序可能会在内存中保留数小时、数天甚至数周。这很好。它们不会耗尽电池或使用其他资源,因此没有缺点;好处是当你需要它们时它们会加载得更快,并且会立即将它们加载回你离开的地方。
(此时还值得注意的是,保持 RAM 空闲并没有任何好处。RAM 存在以供使用,并且在任何给定时间使用所有内存(或至少使用几乎所有内存)将确保您的手机或平板电脑运行起来比您尝试保留一些 RAM 空闲时更流畅。)
考虑到这一切,为什么关闭应用对 Android 的影响比让它们打开更糟糕。
参考:androidtipsandhacks.com
【解决方案2】:
回答您的问题更新并同意已发布的答案,即将应用程序保留在内存中可能更适合电池和应用程序恢复/启动。
移动设备被设计成完全可移动的,可以一直放在口袋或手中,连接到电源插座只是为了充电,通常仅此而已。因此,它必须具有以省电为中心的设计。
台式机始终连接到插座,因此没有移动设备的电池缺点和要求。
关于笔记本电脑,虽然它们是便携式的,但实际上它们大部分时间都在使用,也连接到电源插座。它们可以从一个点带到另一个点这一事实并不能使它们与移动设备相媲美。
因此,尽管现在桌面操作系统具有主要为笔记本电脑量身定制的省电功能,但它们的设计重点是主机设备通常会连接到电源插座上工作,而且它们从未进化到拥有以省电为中心的设计,这是移动设备的“必备”要求。
另一方面,如果您想考虑的不是电池而是应用程序恢复/启动的好处,那么实际上这种功能已经在两种类型的操作系统中实现,但方式非常不同。例如,在 Windows 中,您可以最小化程序,这与在 Android 中按下主页按钮完全相同。要关闭它,请按角落的 x 按钮或程序的退出选项,这就像进入 Android 应用程序任务管理器(最近的应用程序历史记录)并终止应用程序。
【解决方案3】:
因为某些应用程序的行为依赖于后台服务,如果主进程被杀死,这些服务将无法工作。当您从最近的应用程序中刷掉一个应用程序时,您并没有真正杀死该应用程序,后台服务仍然存在。
假设您关闭了 Whatsapp,而操作系统认为终止整个进程是个好主意。除非您重新启动应用程序,否则您不会收到任何消息。
【解决方案4】:
根据documentation,android app中应用进程有4种状态。
让我们看几个案例。
1. 应用已运行Activity。用户按下主页按钮。
在这种情况下,应用状态将从Foreground 移动到Cached。
Cached 状态用于在用户在应用之间切换时提供更好的用户体验。因为打开缓存的活动比从保存状态恢复要快得多。
2. 应用已运行Activity 和Service。用户按下主页按钮。
在这种情况下,应用状态将从Foreground 移动到Service。
Service 状态用于具有一些不重要后台作业的进程。在这种情况下,进程被保留,因为它有一些后台工作要做。当然,您可以将您的 Service 移动到单独的进程中,但这不是默认行为。
3. 应用已运行Activity 和前台Service。用户按下主页按钮。
在这种情况下,应用程序状态将从Foreground 移动到Visible。
Visible 状态用于用户可见的进程,但他不直接与之交互。前台Service 用于执行重要的后台工作,并将进程保持在Visible 状态。同样UI 和Background 应用的部分默认放置在同一个进程中。