Android - 如何决定是否在单独的进程中运行服务?

时间:2011-01-11 14:12:52

标签: android process service

我正在开发一个Android应用程序,可以在多个小时内收集传感器数据。 为此,我们有一个收集传感器数据的服务(例如加速,GPS,......),进行一些处理并将它们远程存储在服务器上。

目前,此服务在一个单独的进程中运行(在清单中使用 android:service =":background" )。这使活动和服务之间的通信变得复杂,但我的前任以这种方式创建了应用程序,因为他们思考将服务与活动分开会使其更稳定。

我希望运行单独流程的更多事实原因。有什么好处?它真的运行得更稳定吗?如果服务器处于一个单独的进程中,那么该服务是否更不可能被操作系统杀死(以释放资源)?

我们的应用程序使用startForeground()和朋友来最小化被操作系统杀死的可能性。

Android文档对此并不十分具体,主要是它依赖于应用程序的目的; - )

TL; DR 将长期运行的服务放在单独的进程(在Android中)的客观原因是什么?

4 个答案:

答案 0 :(得分:20)

首先,请阅读component lifecycles的说明。从中可以看出,您实际上并不能保证允许Service或其他组件长时间运行。

但是,它听起来像Service是您描述的功能的正确选择。这是因为您正在执行一些非面向用户的操作。回到生命周期描述,每当一个Activity不在前台时,它基本上就是被杀的候选者。

您应该考虑使用AlarmManager定期触发您的Service。您可能还需要查看使用@CommonsWare创建的WakefulIntent库。

有一篇很好的文章描述了Android博客上名为Multitasking the Android Way的多任务处理和流程,可能会获得有关您感兴趣的流程的更多详细信息。例如:

  

一个常见的误解   Android多任务是不同的   进程和应用程序之间。   在Android中,这些并不紧密   耦合实体:应用程序可能   似乎没有一个用户   当前正在运行的实际流程   应用;多个应用程序可能共享   流程或一个应用程序可能会   使用多个进程取决于   它的需要;一个过程   申请可以保留   Android即使该应用程序是   没有积极做某事。

答案 1 :(得分:20)

降低RAM使用率

Android开发人员文档建议这可能适合保持服务的RAM使用率下降。

来自Managing Your App's Memory: Use multiple processes

  

多个过程可能适合的一个例子是构建一个长时间播放服务音乐的音乐播放器。如果整个应用程序在一个进程中运行,则只要它正在播放音乐,就必须保持为其活动UI执行的许多分配,即使用户当前在另一个应用程序中并且该服务正在控制回放。像这样的应用程序可以分为两个过程:一个用于其UI,另一个用于在后台服务中继续运行的工作。

因此,在单独的进程中运行服务可能会降低应用程序的性能影响,同时还可以降低系统RAM不足时服务被杀的可能性。

降低绩效影响

来自Managing Your App's Memory: Switching Apps

  

如果您的应用程序具有缓存进程并且它保留了当前不需要的内存,则您的应用程序 - 即使在用户未使用它时 - 也会限制系统的整体性能。因此,由于系统内存不足,它可能会从最近最少使用的进程开始终止LRU高速缓存中的进程,但也会考虑哪些进程占用的内存最多。

减少被杀的可能性

来自Managing Your App's Memory: Release memory as memory becomes tight

  

注意:当系统开始终止LRU缓存中的进程时,虽然它主要是自底向上工作,但它确实考虑了哪些进程占用了更多内存,因此会为系统提供更多内存如果被杀,记忆力增加因此,在整体LRU列表中消耗的内存越少,保留在列表中并且能够快速恢复的机会就越大。

因此,当您的服务处于单独的进程中时,您的服务不太可能被杀死,因为该进程的RAM使用率将会更小,因为该服务不共享UI资源。

何时执行此操作

如果您的服务没有使用startForeground(),我发现Android会在需要释放RAM时将其终止,因此服务的RAM消耗并不太重要。因此,如果您只考虑对操作系统和其他应用程序的性能影响,我认为不值得在单独的过程中运行该服务。

但是,如果你使用startForeground(),Android会尽量让你的服务保持活着,因此该进程使用的任何RAM 影响操作系统和其他应用程序。所以在这种情况下,我建议使用一个单独的进程,这可以节省至少10MB的RAM,因此您不会减慢用户设备的速度。

此外,请注意,使您的应用程序多进程容易; Android的SharedPreferences不支持多个进程。我已经制作了a multi-process SharedPreferences implementation in one of my projects,但我还没有发布它以供重复使用。

答案 2 :(得分:14)

在自己的进程中运行服务有一个小优点,即服务的垃圾收集器不会影响您的应用程序,如果单独运行,服务的内存占用量会小一点。

如果您不需要其他应用程序使用该服务,则更喜欢本地服务。或者,您仍然可以在自己的流程中运行该服务,并使用与您的应用程序的不同通信,例如通过广播接收器。有关详细信息,请参阅Android service tutorial

答案 3 :(得分:9)

将服务分开以在不同的进程中运行不会使其更稳定,但在某些情况下,会使您的应用程序更稳定,因为如果此服务崩溃,您的应用程序将不会崩溃,并且可以恢复。