【问题标题】:Android: Keeping data in RAM without affecting battery lifeAndroid:将数据保存在 RAM 中而不影响电池寿命
【发布时间】:2014-02-24 05:40:11
【问题描述】:

在我的应用程序中,我有一组动态(即不能硬编码到服务操作)定义IntentService 如何处理其输入。

我的基本问题是,每次将Intent 传递给Service 时,我不想从它们的XML 文件中加载这些Definition 结构,而是将它们保存在内存中(因为它们又小又快访问是可取的,因为该服务经常被调用)并使用位于 RAM 中的 Definitions 来处理 Intents,因为 Service 接收它们。

从逻辑上讲,我能想到的只是一个永久的背景Service,有大量消息来源说这是一个坏主意(我同意)。

我想基本上我正在寻找的是一种将这些数据存储在 RAM 中直到需要它的方法(就像 Android 对打开的应用程序、启动器等所做的系统一样),并且不会对电池寿命产生任何不利影响(即Service什么都不做,只是将数据保存在 RAM 中直到被调用),但在我的 Service 被调用时可用?

是否有任何可能的方法可以实现这一点,或者我必须非常小心地管理的唯一选项是永久的Service

如果一个永久的Service 是答案,那么IntentService(配置为START_STICKY)会不会只停留在RAM 中并且在通过Intent 之前不会影响电池寿命?

【问题讨论】:

  • 在android中没有真正的永久后台服务。请记住,它首先是电话,因此当电话响起并且内存不足时,包括前台服务在内的任何服务都可能被终止。这种设计是有意的,否则服务可能会占用所有内存,您的手机就会变成智能砖。
  • 好点,我想我只是在我的脑海中永久缓存几 kB 的手机内存以延长持续时间以换取始终快速的快速响应似乎是一个值得的权衡。但我想如果所有应用都这样做,那么“自私”的方法并不适用。

标签: java android android-service


【解决方案1】:

我的基本问题是,不是每次将 Intent 传递给服务时都从它们的 XML 文件中加载这些定义结构,而是希望将它们保存在内存中(因为它们体积小且需要快速访问,因为服务被非常频繁地调用)并使用位于 RAM 中的定义在服务接收到意图时对其进行处理。

首先,“服务被非常频繁地调用”表明您可能已经在 CPU 和电池利用率方面给用户带来了痛苦,具体取决于您对“非常频繁”的定义。相比之下,此磁盘 I/O 的额外电池成本将是最低的。

除此之外,欢迎您在静态数据成员中保留此数据。只要您的流程还在,它们就会一直存在。根据设备发生的情况以及您对“非常频繁”的定义,这些数据可能会在您下次调用服务时提供给您。如果没有,您只需从磁盘重新加载。换句话说,将静态数据成员用作缓存。

从逻辑上讲,我能想到的只是一个永久的后台服务,有大量消息来源说这是一个坏主意(我同意)。

具体来说,磁盘 I/O 的增量电池成本不值得一直占用用户的 RAM。

【讨论】:

  • 感谢@Commons 的回答。我对“非常经常”的使用使它听起来比我想的更戏剧化。该服务由打开Shortcut 的用户调用,因此它仅在他们特别请求时运行。一个关键要求是我希望尽可能快地完成此操作 - 因此是缓存。我认为根据您的回答,Service 只要带有静态成员的“Android 自然允许它”就一直存在,这听起来像是最好的主意。
  • @BT:“服务是由用户打开快捷方式调用的,所以它只在他们特别请求时运行”——更有理由不用担心磁盘 I/O。 “一个关键要求是我希望尽可能快地完成此操作 - 因此是缓存” - 当您运行性能测试以确定磁盘 I/O 实际需要多长时间时,您学到了什么? “只要 'Android 自然允许它' 与静态成员一起挂起的服务听起来是最好的主意” - 那就是你的 IntentService,那么。
猜你喜欢
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多