サンプル実装
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
システムのメモリが不足しており、システムがすぐにメモリを回復しない場合、プロセスは最初に強制終了されるプロセスの 1 つです。アプリの状態を再開するために重要ではないものはすべて完全に解放する必要があります。14 未満の API レベルをサポートするonLowMemory()
には、レベルとほぼ同等のフォールバックとしてメソッドを使用できTRIM_MEMORY_COMPLETE
ます。
http://developer.android.com/reference/android/content/ComponentCallbacks2.html