当您从最近的应用程序列表中滑动某个应用程序时,实际上会发生什么?


147

Ice Cream Sandwich中最新的应用程序列表增加了将应用程序从列表中滑出的功能,从而将其永久关闭(据我所知,这是一种香草功能,而不是CM /自定义ROM)。文档和平台重点似乎并未涵盖此功能的幕后工作,但我很想知道系统实际在做什么。

出于好奇,我决定做一个快速测试:我在CM9安装上启动Music,然后退出了。然后,我检查了最近的应用程序列表,发现它确实在那里(并且基于缩略图处于正确的状态)。然后,我进入Settings->Applications并强行停止了“音乐”应用程序,但该应用程序仍列在最近的列表中,使我相信它与后台徘徊的进程没有联系。

现在我意识到音乐可能是一个糟糕的选择,所以我也使用《今日美国》应用程序进行了测试。这表现出基本相同的行为,尽管最近的应用程序列表中的缩略图未反映出这种情况(我想是缓存的),但似乎它在强制停止后被迫“重新启动”(这是有道理的)。

那么,当您从最近列表中滑出某个应用程序时,在操作系统级别上实际发生了什么?它是否只是从RAM中清除应用程序的数据并进行垃圾回收,从而破坏了其保存状态?

Answers:


68

将应用程序从最近的应用程序列表中滑出是很困难的,是的,没有充分记录。这一直是在各种Android论坛上进行大量讨论的主题...在这里,似乎最好用一些评论来描述共识:行为类似于但不完全与关闭应用程序相同-通常(对于未定义显式后退按钮处理的应用程序)与从应用程序中退出退出该应用程序的次数足够多相同。

该链接包含有关细节的更多详细信息,但总的来说,您可以将其视为退出应用程序。

我认为特定于音乐应用程序可以启动服务,因此,尽管任务本身(音乐应用程序/ UI)可能已关闭,但该服务继续在后台运行,因此您的音乐不会因为任务而突然停止由于内存管理原因而被清除。那可能已经影响了您所看到的。


1
谢谢,该链接有很多不错的讨论。您也可能是正确的:音乐,这可能是一个糟糕的考验。我会尝试另一个应用程序,只是为了踢球。
eldarerathis

2
继续进行下去,因为有关reddit的讨论帮助我找到了一些更好的搜索词,并且我在回答中提到的Dianne Hackborn的一些帖子似乎证实了这一点。谢谢!
eldarerathis 2012年


1
完美,谢谢!对我来说,这个帖子帮我:reddit.com/r/Android/comments/mpevh/...
鲍里斯Strandjev

当您从“最近”列表中滑动应用程序时,即使Rocket Player这样的第三方音乐播放器也会停止播放音乐,即使该服务在后台运行,并且您需要打开该应用程序或再次在小部件中播放才能开始播放音乐。
2015年

78

我似乎发现了神奇的搜索词,这些词引起了Google员工的一些解释。具体来说,我在几个不同的地方找到了Dianne Hackborn来解释当您从最近的列表中滑出某些内容时会发生什么。首先是对她的一个Google+帖子的评论

当您清除最近的任务时,会发生什么特别的事情:(1)杀死应用程序的任何后台或空白进程(请参阅 http://developer.android.com/guide/topics/fundamentals/processes-and- thread.html#Lifecycle 表示什么),以及(2)使用新的 http://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent)API 来告知任何应用程序服务有关已删除任务的信息,因此它可以执行其认为适当的任何操作。

她还在博客评论中指出

实际上,在近期任务中删除条目将杀死该进程存在的所有后台进程。它不会直接导致服务停止,但是有一个API可让他们找出已删除的任务,以决定是否希望它们停止。这样一来,删除说出电子邮件应用程序的最新任务不会导致它停止检查电子邮件。

如果您确实要完全停止应用程序,则可以长按最近执行的任务以转到应用程序信息,然后在此处强制停止。要停止,就是完全杀死了该应用程序-所有进程都被杀死,所有服务都已停止,所有通知已删除,所有警报已删除,等等。在明确要求之前,不允许该应用程序再次启动。

因此,看起来摘要是,从列表中刷出一个应用程序将首先杀死该应用程序的所有后台进程,然后用于onTaskRemoved通知该应用程序后台任务已删除。在那一点上,似乎应该由应用程序来决定发生什么事情,因此我认为从技术上讲,对于超出那一刻应用程序发生了什么没有严格的规定。


那肯定是不明显的行为,非常有趣!
马修(Matthew)

“杀死该进程中存在的任何后台进程。它不会直接导致服务停止”。这仍然是真的吗?我昨天进行了测试。昨天,我在主要流程中轻扫了一个带有后台服务的应用程序。apps => running UI显示0个进程和0个服务。后来,我用一个运行在单独的应用程序特定进程中的进程将同一个应用程序刷掉了。apps =>正在运行的UI表示我有0个进程和1个服务。那是在装有Android 4.4.4的Moto X(2014)上进行的。
史蒂芬·韦克斯勒

@StevenWexler:可能是服务在第一种情况下自行终止,而不是第二种,或者可能是在第二种情况下,主进程确定(出于某种原因)不想停止该服务。很难确定。
eldarerathis 2015年

从最近的列表中刷出后,启动的服务会再次自动启动,再次调用其onCreate。但是在某些应用中,onCreate在onTaskRemoved之前调用,在某些应用中在onTaskRemoved之后调用。为什么这样的行为呢?
umesh,2015年

21

com.android.internal.policy.impl.RecentApplicationsBackgroundcom.android.internal.policy.impl.RecentApplicationsDialog类的源代码中有一些信息。

如果我正确阅读了这些内容,则可以使用特定的处理程序来选择应用程序,但没有什么特别的方法来刷写应用程序,除了onDetachedFromWindow(),这些调用com.android.View.onDetachedFromWindow()基本上会隐藏元素并清除其数据。这将暗示以下事实:在刷卡应用程序时没有发生任何特殊情况,这与Austin Mills的回答相对应,因为由于列表未显示活动的应用程序,因此onPause()在“退出”应用程序时进行的系统调用和其他系统调用已经发生了。


10

我认为它的作用与后退按钮相同。除了一个小变化。它将finish()在应用程序中所有活动/片段。

只是用一个小的自建应用程序做了一些测试。您也可以测试。这是我的测试应用程序:https : //bitbucket.org/Leandros99/lifecycletest(也提供下载。对于那些无法构建的应用程序。)
在每个Activity生命周期方法中(http://developer.android.com/reference/android/app /Activity.html#ActivityLifecycle)为应用打印日志。您可以使用adb logcat进行查看(将Android SDK安装到cd,然后在cmd / shell中键入cd-平台工具adb logcat。现在,您将看到,每次执行“击回”或“主页”按钮之类的操作时,该应用都会打印上述生命周期方法。 )

您的问题:如果我从最近的应用程序抽屉中滑动一个应用程序,该onDestroy方法将被调用。它的功能与后退按钮几乎相同。
希望我能有所帮助。如果有问题,只问。


3

它关闭应用程序,并将其数据存储在RAM中。因此,为您提供更多的RAM空间,以便您可以运行其他应用程序。但是,由于关闭正在使用的应用程序,后台服务不会自动强制关闭。


1
尽管使用日常语言编写,但这实际上是一个相当准确的答案-它捕获了处理已被废弃的事实,但其他许多答案(将其与后退按钮进行了错误地比较)也有所遗漏。但是,这里缺少的是认识到Android无论如何都将在需要获取内存时处理进程,因此,尽管它完成了一些内存清理,但如果需要时会自动发生。
克里斯·斯特拉顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.