我正在开发一个项目,在这个项目中,我们会在特定活动中显示本地粘性通知。当应用程序最小化时也应如此。我必须完成的是在应用程序被杀死时删除本地通知(由于内存不足或Android用户,从最近的应用列表中滑动)。
每当Android使用Activity打开一些空间时,通常会调用onDestroy
。其中一种情况很好,但是从最近的应用列表中滑动应用并不会调用onDestroy
并且粘滞通知会保留。
我做的是,我实现了一个空服务,当应用程序被杀死时(刷卡和系统终止)会强制onDestroy
,所以我可以删除我的通知。
但是,我想要做的是区分滑动和系统杀死。
这甚至可能吗?
答案 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()
。