pab*_*leu 45 service android process
我正在开发一个Android应用程序,它可以在多个小时内收集传感器数据.为此,我们有一个收集传感器数据的服务(例如加速,GPS,......),进行一些处理并将它们远程存储在服务器上.
目前,此服务在一个单独的进程中运行(在清单中使用android:service =":background").这使活动和服务之间的通信变得复杂,但我的前任以这种方式创建了应用程序,因为他们认为将服务与活动分开会使其更稳定.
我想要运行一个单独的流程的更多事实原因.有什么好处?它真的运行得更稳定吗?如果服务器处于单独的进程中,那么服务器是否更不可能被服务器(为了释放资源)而被杀死?
我们的应用程序使用startForeground()和朋友来最小化被操作系统杀死的可能性.
Android文档对此并不十分具体,主要表明它取决于应用程序的用途;-)
TL; DR将长期运行的服务放在一个单独的进程(在Android中)的客观原因是什么?
Eri*_*ine 20
首先要阅读组件生命周期的描述.从中可以看出,您实际上并不能保证Service允许一个或其他组件长时间运行.
但是,它听起来像是Service您描述的功能的正确选择.这是因为您正在执行一些非面向用户的操作.回到生命周期描述,每当一个Activity不在前台时,它基本上就是被杀的候选者.
你应该考虑做用是AlarmManager来定时触发你的Service.您可能还需要查看使用@CommonsWare创建的WakefulIntent库.
有一篇很好的文章描述了Android博客上的多任务和流程,称为Android的Multitasking,可能会获得有关您感兴趣的流程的更多细节.例如:
关于Android多任务的常见误解是流程和应用程序之间的差异.在Android中,这些不是紧密耦合的实体:在没有当前正在运行应用程序的实际进程的情 多个应用程序可以共享进程,或者一个应用程序可以根据其需要使用多个进程; 即使应用程序没有主动执行某些操作,Android也可以保留应用程序的进程.
Sam*_*Sam 20
Android开发人员文档表明这可能适合保持服务的RAM使用率下降.
多个过程可能适合的示例是当构建从服务长时间播放音乐的音乐播放器时.如果整个应用程序在一个进程中运行,则只要它正在播放音乐,就必须保持为其活动UI执行的许多分配,即使用户当前在另一个应用程序中并且该服务正在控制回放.像这样的应用程序可以分为两个过程:一个用于其UI,另一个用于在后台服务中继续运行的工作.
因此,在单独的进程中运行服务可以因此降低应用程序的性能影响,同时还可以降低系统RAM较低时服务被杀的可能性.
如果您的应用程序具有缓存进程并且它保留了当前不需要的内存,则您的应用程序 - 即使在用户未使用它时 - 也会限制系统的整体性能.因此,由于系统内存不足,它可能会杀死LRU高速缓存中的进程,从最近最少使用的进程开始,但也会考虑哪些进程占用大多数内存.
注意:当系统开始终止LRU缓存中的进程时,虽然它主要是自下而上的,但它确实考虑了哪些进程占用了更多的内存,因此如果被杀死将为系统提供更多的内存增益.因此,在整体LRU列表中消耗的内存越少,保留在列表中并且能够快速恢复的机会就越大.
因此,当您的服务处于单独的进程中时,您的服务不太可能被杀死,因为该进程的RAM使用率会更小,因为该服务不共享UI资源.
如果您的服务没有使用startForeground(),我发现Android会在需要释放RAM时将其删除,因此服务的RAM消耗并不太重要.因此,如果您只考虑对操作系统和其他应用程序的性能影响,我认为不值得在单独的进程中运行该服务.
但是,如果你不使用startForeground(),Android将尽量保持你的服务还活着尽可能的,所以任何RAM的使用过程中会影响操作系统和其他应用程序.因此,在这种情况下,我建议使用单独的进程,这可以节省至少10MB的RAM,因此您不会减慢用户设备的速度.
此外,请注意,使您的应用程序多进程并不容易; Android SharedPreferences不支持多个进程.我在我的一个项目中做了一个多进程SharedPreferences实现,但我还没有发布它以供重用.
vog*_*lla 14
在自己的进程中运行服务具有以下优点:服务的垃圾收集器不会影响您的应用程序,并且如果单独运行,则服务的内存占用量会小一些.
如果您不需要其他应用程序使用该服务,则更喜欢本地服务.或者,您仍然可以在自己的过程中运行服务,并使用与您的应用程序的不同通信,例如通过广播接收器.有关详情,请参阅Android服务教程.
| 归档时间: |
|
| 查看次数: |
19190 次 |
| 最近记录: |