【问题标题】:How to avoid system killing service when application/activity is killed应用程序/活动被杀死时如何避免系统杀死服务
【发布时间】:2014-05-27 09:50:54
【问题描述】:

我有一个带有一个activity 和一个service 的应用程序。如果我在service 运行时杀死activity,它也会被杀死。服务不会被杀死对我来说非常重要。如何在系统终止时(或者我通过清除“最近的应用程序”列表终止它)activity service 仍然保持活动状态,直到它完成工作?提前致谢!

【问题讨论】:

  • 您确定没有在 onDestroy 或您的活动代码中的某处销毁服务吗?
  • 是的,我很确定,因为我在日志中看到 service 正在运行,当我清除“最近的应用程序”列表时,service 立即被杀死,然后重新启动,因为我设置了 @ 987654329@标签。
  • 哦,我明白了,你问的是另一件事。但是,是的,我也很确定。我不会在activity 的代码中手动销毁它。但是,另一方面,我的 activity 甚至没有覆盖 onDestroy() 方法,所以它可能设置为在该方法中默认杀死所有相关服务?

标签: android service android-activity system kill-process


【解决方案1】:

您是否正在运行绑定服务?如果是这样,那么系统将在最后一个客户端活动断开连接(终止)时将其终止。这是来自reference page 的简介:

当最后一个客户端与服务解除绑定时,系统会销毁 服务(除非该服务也由 startService() 启动)。

【讨论】:

  • 未绑定服务和系统。我希望在 USER 清除“最近的应用程序”列表并终止活动后服务保持活动状态。
【解决方案2】:

服务不会被杀死对我来说非常重要

您的进程可以基于用户活动(最近的任务列表、第三方任务管理器、设置中的“强制停止”等)或基于操作系统需求(系统 RAM越来越低)。你无法阻止这一点。

您可以采取一些措施来尽量减少操作系统自行决定终止您的进程的可能性,例如在服务上使用startForeground(),但这确实会阻止用户对您的应用进程执行用户想要的操作.

我正在显示该服务的一个窗口,因此如果该服务停止,该窗口就会消失。

大概,如果用户通过最近的任务列表、任务管理器等明确地摆脱了您的应用程序,用户希望您的窗口消失。当然欢迎您在您的记录这将产生的任何负面影响。

也欢迎您尝试将该服务置于单独的进程中。我的理解是,这对 Android 4.4 上的最近任务列表没有帮助,尽管它可能在早期版本的 Android 上。这是否对第三方任务管理器有帮助可能取决于管理器,这对设置中的“强制停止”没有帮助。这也意味着您将不得不处理 IPC、在您的主进程和服务进程都在运行时增加的系统 RAM 消耗等。

【讨论】:

  • 好的,我可以在另一个进程中启动服务,这样当用户杀死我的应用程序进程时,我的服务进程仍然保持不变?
  • @Salivan:哈,我只是在添加一个更新——请参阅编辑后的答案。
  • 该窗口有一个关闭按钮,因此用户可以通过按下它来摆脱该窗口。这也会停止服务。但是有没有办法让服务在用户杀死活动后保持活跃?
  • 您能告诉我如何在单独的进程中启动服务吗?
  • @Salivan:“但是有没有办法让服务在用户杀死活动后保持活跃?” - 这在我的回答中得到了解决。 “你能告诉我如何在一个单独的进程中启动服务吗?” -- 将android:process 属性添加到清单中的<service>。
【解决方案3】:

您可以尝试在您的服务中从onStartCommand 返回START_STICKY:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    handleCommand(intent);
    // We want this service to continue running until it is explicitly
    // stopped, so return sticky.
    return START_STICKY;
}

【讨论】:

  • 我已经这样做了,但这根本没有帮助,因为我需要service 不会停止。我正在显示来自service 的窗口,所以如果service 停止,那么窗口就会消失。重新创建窗口没有意义。即使activity 被杀死,我也需要它留在屏幕上,所以我需要保持service 保持不变,直到窗口关闭。
  • 你可以试试startForeground。
  • 我不认为这会有所帮助,因为我想避免service 在用户清除“最近的应用程序”列表时被杀死。不受系统影响。
  • 您的问题是否与此问题有关? code.google.com/p/android/issues/detail?id=63793
  • 那么肯定startForeground 是你应该走的路。如文档中所述:You can set this flag if killing your service would be disruptive to the user。看来这就是您所需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
相关资源
最近更新 更多