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

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

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

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

#1 楼

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

该链接提供了更多详细信息,但总的来说,您可以将其视为退出该应用程序。

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

评论


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

–eldarerathis
2012-2-28 15:28

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

–eldarerathis
2012年3月16日1:00



从Android多任务抽屉中删除应用程序时会发生什么

–ale
13年8月23日在23:43

完美,谢谢!对我来说,这篇文章对我有帮助:reddit.com/r/Android/comments/mpevh/…

– Boris Strandjev
13-10-3在9:18

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

–幸运
2015年7月6日在12:04



#2 楼

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


[W]当您轻扫最近的任务时,它发生的具体情况是:
(1)杀死任何背景或应用程序的空白进程(这意味着什么,请参见
http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html#Lifecycle
)和(2 )使用新的
http://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent)
API来告知应用程序的任何服务有关任务已被删除
,因此它可以执行它认为适当的任何操作。


她还在博客评论中指出:


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

如果您确实要完全停止应用程序,则可以长按
最近的任务以转到应用程序信息,然后强行停在那里。对于停止而言,
是该应用程序的全部杀死-所有进程都被杀死,所有服务
已停止,所有通知已删除,所有警报已删除,等等。该应用程序
不允许再次启动直到明确要求。


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

评论


那肯定是不明显的行为,非常有趣!

–马修·雷德(Matthew Read)
2012年3月16日19:53

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

–史蒂芬·韦克斯勒
15年3月26日在16:10

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

–eldarerathis
2015年3月26日在20:31



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

–umesh
15年8月26日在9:06

#3 楼

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

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

#4 楼

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

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

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

#5 楼

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

评论


尽管使用日常语言编写,但这实际上是一个相当准确的答案-它捕获了处理已被废弃的事实,其他许多答案(将它们与后退按钮进行了错误地比较)也有所遗漏。但是,这里缺少的是认识到Android无论如何都将在需要获取内存时处理进程,因此,尽管它完成了一些内存清理,但如果需要时会自动发生。

–克里斯·斯特拉顿(Chris Stratton)
2014年6月2日14:27