2016-08-19 54 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; 
    } 

所以難怪它總是在我的Android 4.0.4設備上返回false。但對我來說這絕對沒有意義。或者我錯過了什麼?

回答

2

所以難怪它始終返回false

它並不總是返回false

在運行Android 4.3或更早版本的設備上,它將始終返回false。這是因爲當時不存在用作低RAM設備的系統標誌。

在運行Android 4.4或更高版本的設備,它會返回系統標誌的值對於這是否是一個低-RAM設備或不:

/** 
* 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,低RAM設備大多將是Android One設備。根據您獲得設備的位置,您可能不會遇到這些設備之一。

+0

當然,但運行Android 4.3或更高版本的設備更可能是lowRamDevices。那麼爲什麼他們通過支持lib使這種方法適用於舊設備?這絕對沒有意義。 – JensJensen

+0

@JensJensen:「運行Android 4.3或更早版本的設備更可能是lowRamDevices」 - 不一定是Google對低RAM設備的定義。 「那麼爲什麼他們通過支持lib使這種方法適用於較老的設備呢?」 - 幾乎所有以'... Compat'結尾的類都以這種方式工作。他們呼籲在兼容設備上實現真正的實現,並在舊設備上返回一些存根。有時候,存根更復雜。在這種情況下,我同意他們應該根據實際的設備RAM獲得一個值。 – CommonsWare

+0

該實現與其他支持庫一致。這聽起來像你想把舊設備視爲低RAM,所以我會說你最好將抽象調用和檢查API版本和isLowRamDevice()標誌放在一起。 –