樣品實施
public class AppContext extends Application {
//This my introduce OutOfMemoryException if you don't handle register and removal quiet well, better to replace it with weak reference
private static List<IMemoryInfo> memInfoList = new ArrayList<AppContext.IMemoryInfo>();
public static abstract interface IMemoryInfo {
public void goodTimeToReleaseMemory();
}
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
//don't compare with == as intermediate stages also can be reported, always better to check >= or <=
if (level >= ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW) {
try {
// Activity at the front will get earliest than activity at the
// back
for (int i = memInfoList.size() - 1; i >= 0; i--) {
try {
memInfoList.get(i).goodTimeToReleaseMemory();
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
*
* @param implementor
* interested listening in memory events
*/
public static void registerMemoryListener(IMemoryInfo implementor) {
memInfoList.add(implementor);
}
public static void unregisterMemoryListener(IMemoryInfo implementor) {
memInfoList.remove(implementor);
}
}
public class ActivityParent extends Activity implements AppContext.IMemoryInfo {
protected ActivityParent child;
@Override
protected void onStop() {
super.onStop();
try {
if (child != null)
AppContext.unregisterMemoryListener(child);
} catch (Exception e) {
}
}
}
public class ActivityChild extends ActivityParent {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
child = this;
}
/---move following onResume() in parent as following eg:
/*
*@Override
* protected void onResume() {
* super.onResume();
* if(null != child){
* AppContext.registerMemoryListener(this);
* }
* }
*/
@Override
protected void onResume() {
super.onResume();
AppContext.registerMemoryListener(this);
}
@Override
public void goodTimeToReleaseMemory() {
super.goodTimeToReleaseMemory();
//remove your Cache etc here
}
//--NO Need because parent implementation will be called first, just for the sake of clarity
@Override
protected void onStop() {
super.onStop();
try {
if (null != child)
AppContext.unregisterMemoryListener(child);
} catch (Exception e) {
}
}
更多信息:
當您的應用程序正在運行時: TRIM_MEMORY_RUNNING_MODERATE 設備開始在內存中運行不足。你的應用程序正在運行,而不是可利用的。
TRIM_MEMORY_RUNNING_LOW 設備在內存上的運行要低得多。您的應用程序正在運行,但無法運行,但請釋放未使用的資源以提高系統性能(這直接影響您應用程序的性能)。
TRIM_MEMORY_RUNNING_CRITICAL 設備運行時內存極低。您的應用程序尚未被視爲一個可驅動的進程,但如果應用程序不釋放資源,系統將開始殺死後臺進程,因此您應該立即釋放非關鍵資源以防止性能下降。
當你的應用的可見性更改: TRIM_MEMORY_UI_HIDDEN 您的應用程序的UI不再是可見的,所以這是釋放被你的UI只用大量的資源的好時機。
當你的應用程序的過程中駐留在後臺LRU列表: TRIM_MEMORY_BACKGROUND 在系統運行時內存不足,你的過程是靠近LRU
列表的開頭。儘管您的應用程序進程沒有被殺死的高風險,但系統可能已經在查殺LRU
列表中的進程,因此您應該釋放易於恢復的資源,以便您的進程將保留在列表中,並在用戶返回到您的應用程序。
TRIM_MEMORY_MODERATE 系統內存不足,進程接近LRU列表的中間位置。如果系統進一步受限於內存,那麼您的進程就有可能被殺死。
TRIM_MEMORY_COMPLETE 在系統運行時內存不足,你的流程是,如果系統沒有現在恢復記憶被殺害的第一個。你應該釋放一切對恢復你的應用程序狀態不重要的東西。 要支持低於14的API級別,可以使用onLowMemory()
方法作爲回退,該回退大致等於TRIM_MEMORY_COMPLETE
級別。
http://developer.android.com/reference/android/content/ComponentCallbacks2.html
請注意,系統在所有Android組件上調用onTrimMemory(level) - 而不僅僅是Activity/Fragment。 – Tom
請參閱此處的示例實現http://stackoverflow.com/a/28210326/185022 –