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

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

目前,这个服务运行在一个单独的进程中(在清单中使用android:service =“:background” )。 这使得活动和服务之间的沟通变得复杂,但是我的前任们这样创build了这个应用程序,因为他们认为把服务和活动分开会使它更加稳定。

我想为运行一个单独的过程而付出更多实际的理由。 有什么优势? 它真的运行更稳定吗? 如果服务在一个单独的进程中,服务是否可能被操作系统杀死(释放资源)?

我们的应用程序使用startForeground()和朋友,以尽量减less被操作系统杀死的机会。

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

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

首先要了解组件生命周期的描述。 拿走这个,你真的不能保证一个Service或其他组件将被允许长时间运行。

但是,它听起来像一个Service是您描述的function的正确select。 这是因为你正在做一些不是用户面对的操作。 回到生命周期的描述,任何时候Activity都不在前台,它本质上是被杀的人选。

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

在Android博客上有一篇很好的文章描述了多任务和stream程,这个博客叫做“ 多任务处理Android的方式” ,它可能会提供一些关于你感兴趣的stream程的更多细节。例如:

Android多任务的一个常见误解是stream程和应用程序之间的差异。 在Android中,这些不是紧密耦合的实体:应用程序似乎对用户而言没有实际进程运行应用程序; 多个应用程序可以共享进程,或者一个应用程序可以根据其需要使用多个进程; 应用程序的进程可能会被Android保留,即使应用程序没有主动执行某些操作。

减less内存使用量

Android开发者文档build议这可能适合于保持服务的内存使用率下降。

从pipe理您的应用程序的内存:使用多个进程 :

当多个进程可能适合的时候,例如当build立一个长时间播放来自服务的音乐的音乐播放器时。 如果整个应用程序在一个进程中运行,那么即使用户当前在另一个应用程序中并且该服务正在控制回放,只要它正在播放音乐,为其活动用户界面执行的许多分配就必须保持在周围。 像这样的应用程序可能会分成两个进程:一个用于其UI,另一个用于继续在后台服务中运行的工作。

因此,在单独的进程中运行服务可能会降低应用程序对性能的影响,同时也降低了系统RAM低时服务被终止的可能性。

降低性能影响

从pipe理您的应用程序的内存:切换应用程序 :

如果您的应用程序具有caching的进程,并且保留了当前不需要的内存,那么您的应用程序即使在用户不使用它的情况下也会限制系统的整体性能。 因此,当系统内存不足时,它可能会以最近最less使用的进程开始,终止LRUcaching中的进程,同时也会考虑哪些进程占用的内存最多。

降低被杀的可能性

从pipe理你的应用程序的内存:释放内存随着内存变得紧张 :

注意:当系统开始在LRUcaching中查杀进程时,尽pipe它主要是自下而上的,但它确实考虑了哪些进程消耗了更多的内存,从而为系统提供了更多的内存增益。 因此,在整个LRU列表中消耗的内存越less,留在列表中的机会就越好,并且能够快速恢复。

因此,当您的服务处于单独的进程中时,您的服务不太可能被中止,因为该服务不会共享UI资源,所以进程的内存使用量会更小。

什么时候这样做

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

但是,如果您使用startForeground() ,则Android将尽可能保持您的服务的活跃性,因此该进程使用的任何RAM 都将影响操作系统和其他应用程序。 所以在这种情况下,我build议使用一个单独的进程,这可以节省至less10MB的RAM,所以你不会放慢用户的设备。

另外,请注意,使您的应用程序多进程是容易的; Android的SharedPreferences不支持多个进程。 我在我的一个项目中做了一个多进程的SharedPreferences实现 ,但是我还没有发布它来重用。

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

如果其他应用程序对服务的消费不是您的要求,则更喜欢本地服务。 或者,您仍然可以在自己的过程中运行服务,并使用与您的应用程序不同的通信,例如通过广播接收器。 详情请参阅Android服务教程 。

将服务分离到不同的进程中运行并不会使它更加稳定,但是在某些情况下,使得你的应用程序更加稳定,因为如果这个服务崩溃了,你的应用程序不会崩溃,并且可以恢复。