【问题标题】:how to determine when the device has low memory on Android如何在Android上确定设备何时内存不足
【发布时间】:2015-06-01 07:05:22
【问题描述】:

我的应用是在前台运行的后台服务。在内存不足的情况下,我的一些处理线程被杀死而没有重新启动应用程序。这导致了非常奇怪的行为。当我的进程被杀死之前内存不足时,我希望操作系统能提醒我。这将允许我释放内存或重新启动我的应用程序。我似乎找不到这种情况的广播或通知。

【问题讨论】:

标签: android multithreading memory process ram


【解决方案1】:
  1. Android 内部有一个后台服务“DeviceStorageMonitorService”持续运行,定期检查系统存储目录。
  2. 此服务维护的内存阈值为分配的内部系统内存的 10%,因此对于 P2,它是 861MB,因此内存阈值为 86 MB。 我们可以通过更改 DeviceStorageMonitorService.java 文件中的宏 DEFAULT_THRESHOLD_PERCENTAGE 来改变这一点。
  3. 它使用内存阈值检查可用内存的大小,如果小于阈值内存,它将广播通知和粘性广播意图ACTION_DEVICE_STORAGE_LOW。 如果内存已满,则 ACTION_DEVICE_STORAGE_FULL

在您的接收器中接收此广播意图并处理应用程序。

【讨论】:

  • 我遇到了这个问题,但我认为它监控的是设备内部或外部存储而不是 RAM。那么你认为如果我在收到 ACTION_DEVICE_STORAGE_LOW 意图时释放内存或重新启动我的应用程序,它应该可以解决我的问题吗?谢谢
  • 我在那里查看,是的,这确实是我正在寻找的。再次感谢,希望这对其他人有帮助。
  • 我觉得它应该可以解决您的问题。当你得到这个意图时。您需要处理您的应用程序,因为框架会在内存不足时通知应用程序,如果应用程序不处理它,它将杀死优先级较低的进程。
  • 这是真的,你认为重启应用可以通过增加优先级来解决这个问题
  • 刚刚查看了源代码,我很确定您最初的直觉认为这仅用于设备存储(即闪存)而不是 RAM 是正确的。它监控 /system、/data 和 /cache 文件系统上的可用空间,并在它们太低时发出警报。它甚至不查看可用的 RAM。
【解决方案2】:

我建议您在此处阅读“管理应用程序的内存”:https://developer.android.com/training/articles/memory.html。系统回调方法 onTrimMemory 将通知您不同的 RAM 使用场景,如方法参数的值所示。有关详细信息,请参阅https://developer.android.com/reference/android/content/ComponentCallbacks2.html#onTrimMemory(int)。这个方法的描述说:

当操作系统确定这是一个好时机时调用 用于从其进程中修剪不需要的内存的进程。这将 例如,当它进入后台并且没有 足够的内存来保持尽可能多的后台进程运行。 您永远不应该与级别的确切值进行比较,因为新的 可以添加中间值——您通常需要比较 如果该值大于或等于您感兴趣的级别。

要在任何时候检索进程当前的修剪级别,您可以使用 ActivityManager.getMyMemoryState(RunningAppProcessInfo)。

例如,TRIM_MEMORY_COMPLETE 作为 onTrimMemory 的参数:

public static final int TRIM_MEMORY_COMPLETE Level for onTrimMemory(int):进程接近后台 LRU 列表的末尾,如果很快没有找到更多内存,它将是 被杀。常数值:80 (0x00000050)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-21
    • 2013-08-02
    • 1970-01-01
    • 2014-11-18
    • 2011-11-17
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    相关资源
    最近更新 更多