android+"low+memory"+消息,Android 应用内存优化 之 onLowMemory & onTrimMemory

OnLowMemory:

是Android提供的API,在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,系统会调用OnLowMemory。

OnTrimMemory:

是Android 4.0之后提供的API,系统会根据不同的内存状态来回调。根据不同的内存状态,来响应不同的内存释放策略。

onTrimMemory传入的几个内存级别释放内存:

TRIM_MEMORY_RUNNING_MODERATE

你的应用正在运行,并且不会被杀死,但设备已经处于低内存状态,并且开始杀死LRU缓存里的内存。

TRIM_MEMORY_RUNNING_LOW

你的应用正在运行,并且不会被杀死,但设备处于内存更低的状态,所以你应该释放无用资源以提高系统性能(直接影响app性能)

TRIM_MEMORY_RUNNING_CRITICAL

你的应用还在运行,但系统已经杀死了LRU缓存里的大多数进程,所以你应该在此时释放所有非关键的资源。如果系统无法回收足够的内存,它会清理掉所有LRU缓存,并且开始杀死之前优先保持的进程,像那些运行着service的。同时,当你的app进程当前被缓存,你可能会从onTrimMemory()收到下面的几种level.

TRIM_MEMORY_BACKGROUND

系统运行在低内存状态,并且你的进程已经接近LRU列表的顶端(即将被清理).虽然你的app进程还没有很高的被杀死风险,系统可能已经清理LRU里的进程,你应该释放那些容易被恢复的资源,如此可以让你的进程留在缓存里,并且当用户回到app时快速恢复.

TRIM_MEMORY_MODERATE

系统运行在低内存状态,你的进程在LRU列表中间附近。如果系统变得内存紧张,可能会导致你的进程被杀死。

TRIM_MEMORY_COMPLETE

系统运行在低内存状态,如果系统没有恢复内存,你的进程是首先被杀死的进程之一。你应该释放所有不重要的资源来恢复你的app状态。

状态版本添加说明:

TRIM_MEMORY_COMPLETE:内存不足,并且该进程在后台进程列表最后一个,马上就要被清理

TRIM_MEMORY_MODERATE:内存不足,并且该进程在后台进程列表的中部。

TRIM_MEMORY_BACKGROUND:内存不足,并且该进程是后台进程。

TRIM_MEMORY_UI_HIDDEN:内存不足,并且该进程的UI已经不可见了。

以上4个是4.0增加

TRIM_MEMORY_RUNNING_CRITICAL:内存不足(后台进程不足3个),并且该进程优先级比较高,需要清理内存

TRIM_MEMORY_RUNNING_LOW:内存不足(后台进程不足5个),并且该进程优先级比较高,需要清理内存

TRIM_MEMORY_RUNNING_MODERATE:内存不足(后台进程超过5个),并且该进程优先级比较高,需要清理内存

以上3个是4.1增加

onTrimMemory()是在API 14里添加的,你可以在老版本里使用onLowMemory()回调,大致跟TRIM_MEMORY_COMPLETE事件相同。

onLowMemory、 onTrimMemory优化,需要释放什么资源?

在内存紧张的时候,会回调OnLowMemory/OnTrimMemory,需要在回调方法中编写释放资源的代码。

可以在资源紧张的时候,释放UI 使用的资源资:Bitmap、数组、控件资源。

注意回调时刻:

OnLowMemory被回调时,已经没有后台进程;而onTrimMemory被回调时,还有后台进程。

OnLowMemory是在最后一个后台进程被杀时调用,一般情况是low memory killer 杀进程后触发;而OnTrimMemory的触发更频繁,每次计算进程优先级时,只要满足条件,都会触发。

在Application、 Activity、Fragement、Service、ContentProvider中都可以重写回调方法,对OnLowMemory/OnTrimMemory进行回调,在回调方法中实现资源释放的实现。

以Activity为例,在Activity源码中能够看到对于onTrimMemory的定义,因此在回调的时候重写方法即可。

优化:

用户退出ui时,在Activity里实现onTrimMemory()回调,你应该在这个方法里监听TRIM_MEMORY_UI_HIDDEN,它表示你的UI从视图中隐藏了,你需要释放只有UI使用的资源。

1 @Override2 public void onTrimMemory(intlevel) {3 super.onTrimMemory(level);4 if (!getProcessName().equals(packageName)) {5 return;6 }7 }

实现:

1. 声明:

1 public static class ViewComponentCallbacks implementsComponentCallbacks {2   @Override3   public voidonConfigurationChanged(Configuration arg) {4   }5

6   @Override7   public voidonLowMemory() {8     //释放资源

9     super.onLowMemory();10   }11 }

2. 注册自定义的回调类:

1 HandlerMemoryCallbacks callBacks =newHandlerMemoryCallbacks();2 this.registerComponentCallbacks( callBacks );

OnTrimMemory是Android在4.0之后加入的一个回调,任何实现了ComponentCallbacks2接口的类都可以重写实现这个回调方法.OnTrimMemory的主要作用就是 指导应用程序在不同的情况下进行自身的内存释放,以避免被系统直接杀掉,提高应用程序的用户体验.

参考:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值