- 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/
Java 专家需要您的帮助。 今天我在一次采访中被问到这个问题,但我无法解决。所以我需要一个解决方案来解决这个问题; 反转字符串 Input : Hello, World! Output : oll
目标:单击按钮并将成分作为单独的项目添加到数组中。 当前设置: 这给出:蓝莓芒果柠檬汁 然后我希望能够通过单击按钮将成分作为单独的项目添加到数组中: var allI
如何编写正则表达式来匹配它(参见箭头): "this is a ->'' this is a "test' there is another "test' 第二种情况 /\b'/ Regex Demo
我有一个数组,其中包含有限数量的项目。我想随机删除项目,直到所有项目都被使用过一次。 示例 [1,2,3,4,5] 使用了随机数 5,所以我不想再这样了。使用了随机数 2,所以我不想再这样了。等等..
首先,抱歉,如果这太主观了,我只是不知道还能怎么问/去哪里问。 无论如何,鉴于我最近的所有问题,我准备很快发布一个 Android 应用程序,并且大部分测试都是在我的手机 Droid 上完成的。我真的
这可能不是这个问题的正确位置,如果不合适请随意移动它。我标记为 Delphi/Pascal 因为这是我在 atm 中工作的内容,但这可能适用于我猜的所有编程。 无论如何,我正在做一些代码清理,并考虑将
我像这样分隔了其余 api 的路由。有没有更好的方法来组织路由器?还是我现在的做法没问题? app.js app.use('/api/auth',auth); 应用程序/ Controller /au
我在 2 个单独的工作表中包含以下数据: 表1: A B C D a ff dd ff ee b 12 10 10 12 表2: A B C
我正在使用 jQuery,并在位于单独 HTML 文件中的表中获取了几行。单击时,每一行都会成功重定向到本地 HTML 文件。 (使用window.location) 我想要实现的目标 我想要完成的是
我有重叠背景图像的问题,当它们重叠时会导致阴影比不重叠时更暗,从而产生不均匀的阴影。 我有一个高度灵活的盒子,带有一些透明的背景图像和阴影以创建漂亮的边框。盒子本质上是 3 个元素。 您可以在此处找到
按照正常的微服务框架,我们希望将每个微服务放入其自己的 git 存储库中,然后为 Service Fabric 项目创建一个存储库。当我们更新其中一个微服务时,Service Fabric 项目将仅重
我想将多个片段嵌入到一个指令中。这是我的设置方式。 Everyone Development (3)
我希望在保留原件的同时将多个文件 gzip 到一个目录中(到多个 .gz 文件中)。 我可以使用这些命令来处理单个文件: find . -type f -name "*cache.html" -exe
有没有办法分别知道每个 Eclipse 插件消耗了多少内存? 最佳答案 进行堆转储并使用例如分析它Eclipse Memory Analyser . 如需更多信息,请参阅 Analyzing Equi
我们使用cusrom插件并以这种方式定义脚本(这是一个近似的伪代码): //It is common part for every script (1) environments { "env1"
我在控制台应用程序中托管了一个集线器,并有一个 WPF 应用程序连接到它。它工作得很好。然后我将集线器移到一个单独的项目中,并将主机的引用添加到新项目中。现在我收到 500 错误,没有其他详细信息。
是否可以在单独的 JAR 文件中为 JavaBean 构建类?具体来说,JavaBean 在一个 JAR 文件中具有 Bean 和 BeanInfo 类,而自定义属性编辑器类位于另一个 JAR 文件中
好的,所以我有一个 MAF 应用程序,它在单独的应用程序域中加载每个插件。这非常适合我的需要,因为它允许我在运行时动态卸载和重新加载我的插件。 问题是,我需要能够在子应用域中处理未处理的异常,捕获它,
在参加在线数据库类(class)(针对初学者)时,我注意到一个问题,我必须查找涉及...至少两个不同值的查询...例如, ELMASRI 书中的 COMPANY 数据库指出:查找至少从事两个不同项目的
(首先:我已经尝试了涉及边距、边框等的所有选项。) Link to problematic page. Link to similarly constructed, non-problematic p
我是一名优秀的程序员,十分优秀!