内存优化之浅谈onLowMemory和onTrimMemory

android开发的过程中,我们会经常遇到oom的情况,这个问题一直是个头疼的问题。它就像是风湿的病症一样,很难根治。

Android每个应用都有独立的DVM,每个DVM的内存分配也是有限的。当内存不足的时候,系统会杀死后台进程。这个时候ComponentCallbacksonLowMemory方法会被回调,ApplicationActivityFragementService都是它的子类

    @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;

        }
    }

可以在ApplicationActivityFragementServiceContentProvider中重写onTrimMemory(int level)onLowMemory()这两个方法来实现对资源的释放,比如Bitmap或者List


 

你可能感兴趣的:(android内存优化,Android开发的点点滴滴)