как определить когда у устройства мало памяти на Android - PullRequest
1 голос
/ 21 марта 2012

Мое приложение - это фоновая служба, работающая на переднем плане. В ситуациях с нехваткой памяти некоторые из моих потоков обработки уничтожаются без перезапуска приложения. Это вызывает очень странное поведение. Я хотел бы, чтобы ОС предупреждала о том, что памяти недостаточно, прежде чем мой процесс будет убит. Это позволит мне освободить память или перезапустить мое приложение. Похоже, я не могу найти трансляцию или уведомление для этой ситуации.

Ответы [ 2 ]

2 голосов
/ 21 марта 2012
  1. В Android постоянно работает одна фоновая служба DeviceStorageMonitorService, которая периодически проверяет каталог системного хранилища.
  2. Эта служба поддерживает порог памяти, который составляет 10% от назначенной внутренней системной памяти, поэтому в случае P2 это 861 МБ, поэтому порог памяти составляет 86 МБ.Мы можем изменить это, изменив макрос DEFAULT_THRESHOLD_PERCENTAGE внутри файла DeviceStorageMonitorService.java.
  3. Он проверяет размер доступной памяти с порогом памяти, если он меньше, чем порог памяти, он будет транслировать уведомление и фиксированное широковещательное намерение ACTION_DEVICE_STORAGE_LOW.В случае полного намерения памяти ACTION_DEVICE_STORAGE_FULL

Получите это переданное намерение в приемнике и обработайте заявку.

1 голос
/ 01 июня 2015

Я предлагаю вам прочитать «Управление памятью вашего приложения» здесь: https://developer.android.com/training/articles/memory.html. Системный метод обратного вызова onTrimMemory сообщит вам о различных сценариях использования ОЗУ, как указано в значении аргумента метода.Смотрите https://developer.android.com/reference/android/content/ComponentCallbacks2.html#onTrimMemory(int) для деталей.Описание этого метода гласит:

Вызывается, когда операционная система определила, что настало время для процесса урезать ненужную память из своего процесса.Это произойдет, например, когда он работает в фоновом режиме и недостаточно памяти, чтобы поддерживать столько фоновых процессов, сколько требуется.Вы никогда не должны сравнивать с точными значениями уровня, так как могут быть добавлены новые промежуточные значения - вы, как правило, захотите сравнить, если значение больше или равно интересующему вас уровню.

Чтобы получитьобрабатывает текущий уровень обрезки в любой точке, вы можете использовать ActivityManager.getMyMemoryState (RunningAppProcessInfo).

Например, TRIM_MEMORY_COMPLETE в качестве аргумента для onTrimMemory:

public static final intTRIM_MEMORY_COMPLETE Уровень для onTrimMemory (int): процесс приближается к концу фонового списка LRU, и если больше памяти не будет найдено в ближайшее время, он будет уничтожен.Постоянное значение: 80 (0x00000050)

...