在android开发的过程中,我们会经常遇到oom的情况,这个问题一直是个头疼的问题。它就像是风湿的病症一样,很难根治。
Android每个应用都有独立的DVM,每个DVM的内存分配也是有限的。当内存不足的时候,系统会杀死后台进程。这个时候ComponentCallbacks的onLowMemory方法会被回调,Application、 Activity、Fragement、Service都是它的子类
@Override
public void onLowMemory() {
super.onLowMemory();
Log.e(tag,"有后台进程被杀了");
}
而ComponentCallbacks的子类ComponentCallbacks2中的onTrimMemory(int level)方法会频繁回调,通过level来判断回调的情况
/**
* 当onTrimMemory被调用的时候,应该考虑降低应用的内存资源。
*/
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
switch (level){
/*
* 应用正在运行,并且不会被杀死,但系统已经处于低内存状态,并且开始杀死LRU缓存里的进程。
*/
case TRIM_MEMORY_RUNNING_MODERATE:
Log.e(tag,"TRIM_MEMORY_RUNNING_MODERATE");
break;
/*
* 应用正在运行,并且不会被杀死,但系统处于内存更低的状态,所以应该释放无用资源以提高系统性能,当前的低内存已经影响到你的app体验了。
*/
case TRIM_MEMORY_RUNNING_LOW:
Log.e(tag,"TRIM_MEMORY_RUNNING_LOW");
break;
/*
* 应用还在运行,但系统已经杀死了LRU缓存里的大多数进程,所以应该在此时释放所有非关键的资源。
* 如果内存还是无法降低,高优先级保持的应用也存在被杀的风险。
*/
case TRIM_MEMORY_RUNNING_CRITICAL:
Log.e(tag,"TRIM_MEMORY_RUNNING_CRITICAL");
break;
/*
* 表示应用程序的所有UI界面被隐藏了,即用户点击了Home键或者Back键导致应用的UI界面不可见。可以释放资源,也可以保存需要的数据。
*/
case TRIM_MEMORY_UI_HIDDEN :
Log.e(tag,"TRIM_MEMORY_UI_HIDDEN");
break;
/*
* 内存不足,并且该进程是后台进程。
*/
case TRIM_MEMORY_BACKGROUND :
Log.e(tag,"TRIM_MEMORY_BACKGROUND");
break;
/*
* 内存不足,并且该进程在后台进程列表的中部。
*/
case TRIM_MEMORY_MODERATE :
Log.e(tag,"TRIM_MEMORY_MODERATE");
break;
/*
* 内存不足,并且该进程在后台进程列表最后一个,马上就要被清理
*/
case TRIM_MEMORY_COMPLETE :
Log.e(tag,"TRIM_MEMORY_COMPLETE");
break;
}
}
可以在Application、 Activity、Fragement、Service、ContentProvider中重写onTrimMemory(int level)、onLowMemory()这两个方法来实现对资源的释放,比如Bitmap或者List