नमूना कार्यान्वयन
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 आपके ऐप का यूआई अब दिखाई नहीं देते है, इसलिए इस बड़े संसाधनों है कि आपके यूआई द्वारा केवल उपयोग किया जाता है जारी करने के लिए एक अच्छा समय है।
जब आपके एप्लिकेशन की प्रक्रिया पृष्ठभूमि LRU सूची में रहता है: TRIM_MEMORY_BACKGROUND सिस्टम स्मृति कम हो रही है और अपने प्रक्रिया LRU
सूची की शुरुआत के पास है। यद्यपि आपकी ऐप प्रक्रिया को मारने के उच्च जोखिम पर नहीं है, फिर भी सिस्टम LRU
सूची में प्रक्रियाओं को मार रहा है, इसलिए आपको उन संसाधनों को छोड़ना चाहिए जो पुनर्प्राप्त करना आसान है, इसलिए आपकी प्रक्रिया सूची में रहेगी और उपयोगकर्ता के तुरंत बाद फिर से शुरू हो जाएगी आपके ऐप पर लौटता है।
TRIM_MEMORY_MODERATE सिस्टम स्मृति कम हो रही है और अपने प्रक्रिया LRU सूची के बीच के पास है। अगर प्रणाली स्मृति के लिए और बाध्य हो जाती है, तो एक मौका है कि आपकी प्रक्रिया मारे जायेगी।
TRIM_MEMORY_COMPLETE सिस्टम स्मृति कम हो रही है और अपने प्रक्रिया पहले से एक है, तो प्रणाली अब स्मृति की वसूली नहीं करता मारे जाने के लिए है। आपको अपनी ऐप स्थिति को फिर से शुरू करने के लिए बिल्कुल महत्वपूर्ण नहीं होना चाहिए। 14 से कम एपीआई स्तरों का समर्थन करने के लिए, आप onLowMemory()
विधि का उपयोग फ़ॉलबैक के रूप में कर सकते हैं जो लगभग TRIM_MEMORY_COMPLETE
स्तर के बराबर है।
http://developer.android.com/reference/android/content/ComponentCallbacks2.html
ध्यान दें कि ऑन एंड्रॉइड घटकों पर सिस्टम द्वारा ट्रिम मेमरी (स्तर) को सिस्टम द्वारा बुलाया जाता है - न केवल गतिविधि/टुकड़ा। – Tom
यहां नमूना कार्यान्वयन देखें http://stackoverflow.com/a/28210326/185022 –