区分Android杀死应用程序和用户在最近的应用程序列表上滑动它

时间:2015-06-19 11:20:46

标签: android android-activity android-lifecycle

我正在开发一个项目,在这个项目中,我们会在特定活动中显示本地粘性通知。当应用程序最小化时也应如此。我必须完成的是在应用程序被杀死时删除本地通知(由于内存不足或Android用户,从最近的应用列表中滑动)。

每当Android使用Activity打开一些空间时,通常会调用onDestroy。其中一种情况很好,但是从最近的应用列表中滑动应用并不会调用onDestroy并且粘滞通知会保留。

我做的是,我实现了一个空服务,当应用程序被杀死时(刷卡和系统终止)会强制onDestroy,所以我可以删除我的通知。

但是,我想要做的是区分滑动和系统杀死。

这甚至可能吗?

7 个答案:

答案 0 :(得分:12)

一般情况下,如果Android想要杀死你的应用程序,因为它已经在后台工作太久(或者因为它想要回收资源),Android只会简单地杀死托管你应用程序的操作系统进程。 会在任何活动或服务组件上调用finish()onDestroy()。 "从最近任务列表中滑动的行为"已经发生了变化,并且在不同的Android版本中有所不同。有人应该写一本关于此的书: - (

答案 1 :(得分:3)

您可以通过向应用添加服务并实施onTaskRemoved方法来检查用户何时滑动关闭应用:https://stackoverflow.com/a/26882533/2441655

答案 2 :(得分:2)

这是我在reddit中发现的评论,在我看来非常有趣:

  

轻扫一个应用程序将有效地"杀死"大多数应用。你可以测试一下   如果您安装了SDK,请使用 ADB 。把所有东西都刷掉   您的最近列表,然后启动浏览器。

     

使用ADB运行' ps'在设备上验证com.google.android.browser进程是否正常运行   运行。转到主屏幕,它仍然在运行。推出其他一些   应用程序和com.google.android.browser进程仍然存在。

     

然后,将其从最近列表中滑出,过程就消失了。您可以   创建一个测试应用程序以进一步验证,并记录 onDestroy ()调用   你的活动。当您返回或回家退出应用时,系统不会调用此消息,   或者当您启动其他应用时。当你滑动它时它会被调用   应用程序出了最近的列表。我同意最近的应用程序   列表不是真的"多任务"。

     

列表中的应用程序甚至不必运行,这些进程可能已被杀死   内存管理器很久才尝试重新打开它。但是,你不能   争辩说,唯一的目的是快速跳转到其他应用程序   滑动使实际过程消失。

This是关于从最近的应用列表中滑动应用时会发生什么的另一个好答案。但我最喜欢的部分是:

  

实际上,删除最近任务中的条目会导致任何背景   流程存在的流程。它不会直接导致原因   要停止的服务,但是有一个API可供他们查找   任务被删除,以决定他们是否希望这意味着他们应该停止。   这是为了删除说电子邮件应用程序的最近任务不会   导致它停止检查电子邮件。

     

如果您真的想要完全停止应用,可以长按   最近的任务转到应用信息,并在那里停止命中。对于停止是   完全杀死应用程序 - 所有进程都被杀死,所有服务   停止,删除所有通知,删除所有警报等。应用程序   在明确请求之前不允许再次启动。

答案 3 :(得分:0)

通过从最近的任务列表中轻扫,仅从最近的任务中删除.. 在android 5.0之前它也被称为onDestroy。 您可能遇到api 20级设备以上的问题。 系统kill通常无法在正常的android活动生命周期中执行。  它刚刚完成了背压事件的活动。

答案 4 :(得分:0)

当应用程序向左滑动时,如果任何线程仍然在你的应用程序中运行中断但服务未停止,当你杀死方便的应用程序线程和服务停止时。

答案 5 :(得分:0)

行为与关闭应用程序类似但不完全相同 - 一般情况下(对于不定义显式后退按钮处理的应用程序),它与回复足够时间的内容相同在你退出的应用程序中。check out this link discussion它对主题有一些很好的输入

答案 6 :(得分:0)

首先,让我们明确一点:Android可能不会调用onDestroy()。从Honeycomb开始,参考Activity Page,保证在应用被杀之前调用onPause()onStop()

  

请注意,这些语义在针对以HONEYCOMB开头的平台的应用与针对先前平台的应用之间会略有不同。从Honeycomb开始,应用程序在其onStop()返回之前不处于killable状态。这可能会在调用onSaveInstanceState(Bundle)时产生影响(可以在onPause()之后安全地调用它,并允许和应用程序安全地等到onStop()以保存持久状态。

所以在(希望)清除Android生命周期的空气后,我认为您可以通过将通知删除代码放在onStop()中来实现您想要的效果。如果你最终需要它回来因为用户实际上已经回到特定的Actvitiy(IE未被杀死),你可以将它带回onRestart()