- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在开发一个在多个小时内收集传感器数据的 Android 应用程序。为此,我们有一个服务来收集传感器数据(例如加速度、GPS 等),进行一些处理并将它们远程存储在服务器上。
目前,此服务在单独的进程中运行(在 list 中使用 android:service=":background")。这使 Activity 和服务之间的通信复杂化,但我的前辈以这种方式创建应用程序,因为他们认为将服务与 Activity 分开会使它更稳定。
我想要一些更实际的原因来运行一个单独的进程。有什么优势?它真的运行更稳定吗?如果 Service 在单独的进程中,它是否不太可能被操作系统杀死(以释放资源)?
我们的应用程序使用 startForeground()和 friend ,以尽量减少被操作系统杀死的机会。
Android 文档对此不是很具体,主要是说这取决于应用程序的用途 ;-)
TL;DR 将长期运行的服务置于单独的进程中(在 Android 中)的客观原因是什么?
最佳答案
Android 开发者文档建议这可能适合降低服务的 RAM 使用率。
来自 Managing Your App's Memory: Use multiple processes :
An example of when multiple processes may be appropriate is when building a music player that plays music from a service for long period of time. If the entire app runs in one process, then many of the allocations performed for its activity UI must be kept around as long as it is playing music, even if the user is currently in another app and the service is controlling the playback. An app like this may be split into two process: one for its UI, and the other for the work that continues running in the background service.
因此,在单独的进程中运行服务可以因此降低应用程序的性能影响,同时还可以降低在系统内存不足时服务被终止的可能性。
来自 Managing Your App's Memory: Switching Apps :
If your app has a cached process and it retains memory that it currently does not need, then your app—even while the user is not using it—is constraining the system's overall performance. So, as the system runs low on memory, it may kill processes in the LRU cache beginning with the process least recently used, but also giving some consideration toward which processes are most memory intensive.
来自 Managing Your App's Memory: Release memory as memory becomes tight :
Note: When the system begins killing processes in the LRU cache, although it primarily works bottom-up, it does give some consideration to which processes are consuming more memory and will thus provide the system more memory gain if killed. So the less memory you consume while in the LRU list overall, the better your chances are to remain in the list and be able to quickly resume.
因此,当您的服务位于单独的进程中时,它被杀死的可能性较小,因为该服务不共享 UI 资源,该进程的 RAM 使用量会更小。
如果您的服务不使用 startForeground()
,我发现 Android 会在需要释放 RAM 时将其杀死,因此服务的 RAM 消耗并不太重要。因此,如果您只是考虑对操作系统和其他应用程序的性能影响,我认为不值得在单独的进程中运行该服务。
但是,如果您确实使用 startForeground()
,Android 会尽量让您的服务保持 Activity 状态,因此进程使用的任何 RAM 会影响操作系统和其他应用程序。所以在这种情况下,我建议使用单独的进程,这样可以节省至少 10MB 的 RAM,这样就不会降低用户设备的速度。
另外,请注意,让您的应用程序实现多进程不容易; Android 的 SharedPreferences
不支持多进程。
关于Android - 如何决定是否在单独的进程中运行服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4658511/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!