【发布时间】:2011-07-05 11:34:34
【问题描述】:
我注意到像 Skype 这样的应用程序使用的服务基本上是 24x7 运行,根本不会被杀死。你甚至不能使用任务杀手手动杀死它(你可以通过运行服务和杀死服务来杀死它们)。这是如何实施的?
我发现在 Android 2.3 中,我的服务在运行一段时间后被终止。即使我使用 START_STICKY 启动服务,也永远不会调用 onDestroy()。但是,这在我的 2.1 设备上运行良好,即服务不会被终止。
谢谢
【问题讨论】:
我注意到像 Skype 这样的应用程序使用的服务基本上是 24x7 运行,根本不会被杀死。你甚至不能使用任务杀手手动杀死它(你可以通过运行服务和杀死服务来杀死它们)。这是如何实施的?
我发现在 Android 2.3 中,我的服务在运行一段时间后被终止。即使我使用 START_STICKY 启动服务,也永远不会调用 onDestroy()。但是,这在我的 2.1 设备上运行良好,即服务不会被终止。
谢谢
【问题讨论】:
这是如何实现的?
根据显示Notification 图标的Skype 屏幕截图,他们很可能使用startForeground()。
我发现在 Android 2.3 中,我的服务在运行一段时间后被终止。
这很正常。
首先,大多数 Android 应用程序并不真正需要“基本上 24x7 全天候运行”的服务。用户不喜欢这样的服务,这就是为什么任务杀手和正在运行的服务屏幕以及操作系统中的自动终止逻辑存在的原因。服务应该“24x7”运行的唯一原因是每微秒交付价值。像 Skype 这样的 VOIP 客户端将在每微秒内提供价值,因为它们正在等待来电。大多数 Android 应用程序不符合此标准。
如果您的服务持续运行,但在用户控制的时间段内(例如,音乐播放器),startForeground() 是一个很好的解决方案。
否则,我宁愿您找到一种方法来消除“基本上 24x7 运行”的服务,使用AlarmManager 切换到用户可控的轮询系统,因此您的服务通常不在内存中,除非它正在交付价值。
【讨论】:
Service 随之而来。但是,由于该服务是前台的一部分,因此任务杀手不能再杀死它(从 Android 2.2 开始,或者可能是 2.1)。但是,如果用户进入设置,他们可以选择停止服务或整个过程。操作系统也会在一段时间后停止服务——我首选的有声读物阅读器使用startForeground(),它会在几天不活动后消失,我认为是操作系统在这样做。
AlarmManager 的意义在于让服务在完成与上一个警报相关的工作后,在警报之间GO AWAY。