【问题标题】:Differentiate between Android killing the app and user swiping it off on the recent apps list区分 Android 杀死应用程序和用户在最近的应用程序列表中将其刷掉
【发布时间】:2015-06-19 11:20:45
【问题描述】:

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

通常,只要 Android 使用 Activity 打开一些空间,就会调用 onDestroy。在其中一种情况下这很好,但是从最近的应用程序列表中滑动一个应用程序不会调用onDestroy 并且粘性通知仍然存在。

我所做的是,我实现了一个空服务,它会在应用程序被终止(滑动和系统终止)时强制onDestroy,以便我可以删除我的通知。

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

这可能吗?

【问题讨论】:

  • 请注意:您所描述的行为已经演变。它们在不同版本的Android中是不同的。仅仅因为某些东西在一个版本(或一个设备)上有效并不意味着它在另一个版本(或另一个设备)上也能同样工作。
  • @DavidWasser 我可以毫无问题地访问OnDestroy() 或者无论如何,我的问题是,是否可以区分刷卡杀戮和系统杀戮。我没有要保存的服务或任何信息。我只想知道哪个事件导致终止应用程序。但是随着我阅读的越来越多,似乎是不可能的
  • 有一个Home按钮的监听器怎么样,如果它是long pressed,你假设如果activity在10秒内被杀死,它被刷了?

标签: android android-activity android-lifecycle


【解决方案1】:

一般来说,如果 Android 想要终止您的应用程序,因为它在后台的时间过长(或者因为它想要回收资源),Android 只会简单地终止托管您的应用程序的操作系统进程。它不会在任何 Activity 或 Service 组件上调用 finish()onDestroy()。 “从最近的任务列表中滑动”的行为随着时间的推移而发生变化,并且在不同的 Android 版本中有所不同。有人应该为此写一本书:-(

【讨论】:

  • 来自OnDestroy() 的文档:This can happen either because the activity is finishing (someone called finish() on it, or because the system is temporarily destroying this instance of the activity to save space.。如果 Android 杀死了我的活动,它应该调用 onDestroy()
  • 没有。对不起。文档是错误的。 Android 不会杀死活动。它会杀死整个进程。相信我。
  • Activity 的文档中有一个描述生命周期回调的表格。在该部分中,您还将看到:“请注意上表中的“Killable”列 - 对于那些标记为可终止的方法,在该方法返回托管活动的进程后,系统可能会在任何时候都不会执行另一行代码。” Android 可以在调用 onPause()(Android 版本 onStop()(Android 版本 >= 3.0)后随时终止您的进程
  • @Damnum 正如我在上面的评论中所说,文档是错误的(或者至少,它没有具体说明它如何“清除所有活动的任务”)。它甚至说“......根活动已恢复”。如果它只清除了所有其他活动,则不需要恢复根活动。实际上,Android 并没有清除活动来恢复内存。如果任务空闲“太久”(无论如何确定),它只会终止托管应用程序的操作系统进程。相信我。
  • 抱歉,经过更多研究,我在这里找到了我的问题的答案:stackoverflow.com/q/11365301/888881(也来自您:D),谢谢!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这是我在reddit 中发现的一条评论,在我看来真的很有趣:

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

    使用 ADB 在设备上运行 'ps' 并验证 com.google.android.browser 进程是 跑步。转到主屏幕,它仍在运行。启动其他一些 应用程序,并且 com.google.android.browser 进程仍然存在。

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

    列表中的应用程序甚至不一定正在运行,这些进程可能已被 内存管理器在您尝试重新打开它之前很久。然而,你不能 争辩说,唯一的目的是在 滑动使实际过程消失。

    This 是另一个很好的答案,当您从最近的应用程序列表中滑出应用程序时会发生什么。但我最喜欢的部分是:

    实际上,删除最近任务中的条目会杀死所有背景 为进程而存在的进程。不会直接导致 服务停止,但是有一个 API 让他们找出 任务被删除以决定他们是否希望这意味着他们应该停止。 这样一来,删除电子邮件应用程序的最近任务就不会 使其停止检查电子邮件。

    如果你真的想完全停止一个应用,你可以长按 最近的任务要转到应用程序信息,然后在此处强制停止。对于停止是 完全杀死应用程序 - 所有进程都被杀死,所有服务 已停止,所有通知已删除,所有警报已删除,等等。该应用程序 除非明确要求,否则不允许再次启动。

    【讨论】:

    • @Mero 已经发布了这条 reddit 评论,但它是在 3 年前发布的。从那以后情况发生了变化……我知道这两个是如何工作的,重点是如何区分在刷卡杀和系统杀之间?
    【解决方案4】:

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

    【讨论】:

    • OnDestroy() 在我正在使用的 Android 4.4.4 上没有被调用,但这不是问题。我通过提供空服务来强制OnDestroy()。问题是,我可以区分刷卡杀和系统杀吗?
    【解决方案5】:

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

    【讨论】:

    • 我从不杀死应用程序,我正在尝试弄清楚如何检测它是刷卡杀死还是 Android 已经占用了我的活动(在后台)
    • 我研究了 android 文档,但没有发现自动“system kill”和“swipe kill”之间有任何区别,this 链接可能会有所帮助。
    【解决方案6】:

    该行为与关闭应用程序相似但不完全相同 - 通常(对于未定义显式后退按钮处理的应用程序),它与从您退出的应用程序中返回足够多的时间相同出它。check out this link discussion它对这个主题有一些很好的投入

    【讨论】:

      【解决方案7】:

      首先,让我们弄清楚一件事:Android 可能不会调用 onDestroy()。参考 Activity Page,从 Honeycomb 开始,onPause()onStop() 保证在应用程序被杀死之前被调用。

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

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

      【讨论】:

      • 我不想使用OnStop,因为我希望应用程序通过不使用服务在后台运行(只要它可以,在它被杀死之前)。我知道OnDestroy 并不总是被调用,因此我实现了一个空的Service 来强制它。
      • 好的,我现在明白了。我道歉。如果您的服务被两个事件(Android 系统和用户应用程序滑动)调用,我不确定是否有办法 100% 确定两者之间的差异。你可以为Home 按钮写一个listener,如果它被长按,你就会知道它……就像我说的那样,这不一定100% 捕捉到正确的事件。
      猜你喜欢
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多