2016-08-19 2 views
0

Я хотел использовать вспомогательный метод isLowRamDevice для моего приложения, которое передает потоки видео. Поскольку я поддерживаю устройства вниз, применяю API-уровень 15, мне пришлось использовать ActivityManagerCompat.isLowRamDevice(). Я был очень смущен, что он всегда возвращался неверно, даже если я использую действительно старые устройства. Затем я проверил сам метод и увидел следующее:ActivityManagerCompat.isLowRamDevice бесполезен, всегда возвращает false

public static boolean isLowRamDevice(@NonNull ActivityManager am) { 
     if (Build.VERSION.SDK_INT >= 19) { 
      return ActivityManagerCompatKitKat.isLowRamDevice(am); 
     } 
     return false; 
    } 

Неудивительно, что он всегда возвращает false на моем устройстве Android 4.0.4. Но для меня это не имеет никакого смысла. Или я чего-то не хватает?

ответ

2

Так что не удивительно, что всегда возвращает ложь

Это не всегда возвращает false.

На устройствах под управлением Android 4.3 или старше он всегда будет возвращать false. Это связано с тем, что тогда системный флаг для устройства с низким ОЗУ не существовал.

На устройствах под управлением Android 4.4 или выше, он возвращает значение флага системы для этого, является ли низким ОЗУ устройство или нет:

/** 
* Returns true if this is a low-RAM device. Exactly whether a device is low-RAM 
* is ultimately up to the device configuration, but currently it generally means 
* something in the class of a 512MB device with about a 800x480 or less screen. 
* This is mostly intended to be used by apps to determine whether they should turn 
* off certain features that require more RAM. 
*/ 
public boolean isLowRamDevice() { 
    return isLowRamDeviceStatic(); 
} 

/** @hide */ 
public static boolean isLowRamDeviceStatic() { 
    return "true".equals(SystemProperties.get("ro.config.low_ram", "false")); 
} 

(от the ActivityManager source code)

AFAIK, устройства с низким ОЗУ в основном будут Android One устройств. В зависимости от того, где вы получаете свои устройства, вы не можете столкнуться с одним из них.

+0

Уверены, но устройства под управлением Android 4.3 или старше, скорее всего, lowRamDevices. Итак, почему они сделали этот метод доступным для более старых устройств через lib? Это не имеет никакого смысла. – JensJensen

+0

@JensJensen: «устройства под управлением Android 4.3 или старше более вероятны lowRamDevices» - не обязательно по определению Google для устройств с низким ОЗУ. «Почему они сделали этот метод доступным для более старых устройств через библиотеку поддержки?» - Практически все классы, заканчивающиеся на '... Compat', работают таким образом. Они переходят к реальной реализации на совместимых устройствах и возвращают некоторые заглушки на более старые устройства. Иногда заглушка более изощренна. В этом случае я согласен, что они должны были получить значение, основанное на фактической ОЗУ устройства. – CommonsWare

+0

Реализация согласуется с другими библиотеками поддержки. Похоже, вы хотите относиться к старым устройствам как к низковольтному, поэтому я бы сказал, что вам лучше абстрагировать вызов и проверить версию API и флаг isLowRamDevice(). –