OnTrimMemory 回调是 Android 4.0 以后提供的一个API,这个 API 是提供给开发者的,它的主要做用是提示开发者在系统内存不足的时候,经过处理部分资源来释放内存,从而避免被 Android 系统杀死。这样应用在下一次启动的时候,速度就会比较快。缓存
OnTrimMemory回调的做用?架构
OnTrimMemory是Android在4.0以后加入的一个回调,任何实现了ComponentCallbacks2接口的类均可以重写实现这个回调方法.OnTrimMemory的主要做用就是指导应用程序在不一样的状况下进行自身的内存释放,以免被系统直接杀掉,提升应用程序的用户体验.ide
Android系统会根据不一样等级的内存使用状况,调用这个函数,并传入对应的等级:函数
TRIM_MEMORY_UI_HIDDEN 表示应用程序的全部UI界面被隐藏了,即用户点击了Home键或者Back键致使应用的UI界面不可见.这时候应该释放一些资源.性能
TRIM_MEMORY_UI_HIDDEN这个等级比较经常使用,和下面六个的关系不是很强,因此单独说接口
下面三个等级是当咱们的应用程序真正运行时的回调:进程
TRIM_MEMORY_RUNNING_MODERATE 表示应用程序正常运行,而且不会被杀掉。可是目前手机的内存已经有点低了,系统可能会开始根据LRU缓存规则来去杀死进程了。图片
TRIM_MEMORY_RUNNING_LOW 表示应用程序正常运行,而且不会被杀掉。可是目前手机的内存已经很是低了,咱们应该去释放掉一些没必要要的资源以提高系统的性能,同时这也会直接影响到咱们应用程序的性能。内存
TRIM_MEMORY_RUNNING_CRITICAL 表示应用程序仍然正常运行,可是系统已经根据LRU缓存规则杀掉了大部分缓存的进程了。这个时候咱们应当尽量地去释听任何没必要要的资源,否则的话系统可能会继续杀掉全部缓存中的进程,而且开始杀掉一些原本应当保持运行的进程,好比说后台运行的服务。资源
当应用程序是缓存的,则会收到如下几种类型的回调:
TRIM_MEMORY_BACKGROUND 表示手机目前内存已经很低了,系统准备开始根据LRU缓存来清理进程。这个时候咱们的程序在LRU缓存列表的最近位置,是不太可能被清理掉的,但这时去释放掉一些比较容易恢复的资源可以让手机的内存变得比较充足,从而让咱们的程序更长时间地保留在缓存当中,这样当用户返回咱们的程序时会感受很是顺畅,而不是经历了一次从新启动的过程。
TRIM_MEMORY_MODERATE 表示手机目前内存已经很低了,而且咱们的程序处于LRU缓存列表的中间位置,若是手机内存还得不到进一步释放的话,那么咱们的程序就有被系统杀掉的风险了。
TRIM_MEMORY_COMPLETE 表示手机目前内存已经很低了,而且咱们的程序处于LRU缓存列表的最边缘位置,系统会最优先考虑杀掉咱们的应用程序,在这个时候应当尽量地把一切能够释放的东西都进行释放。
哪些组件能够实现OnTrimMemory回调?
Application.onTrimMemory()
Activity.onTrimMemory()
Fragement.OnTrimMemory()
Service.onTrimMemory()
ContentProvider.OnTrimMemory()
OnTrimMemory回调中能够释放哪些资源?
一般在架构阶段就要考虑清楚,咱们有哪些东西是要常驻内存的,有哪些是伴随界面存在的通常状况下,有下面几种资源须要进行释放:
缓存 缓存包括一些文件缓存,图片缓存等,在用户正常使用的时候这些缓存颇有做用,但当你的应用程序UI不可见的时候,这些缓存就能够被清除以减小内存的使用.好比第三方图片库的缓存.
一些动态生成动态添加的View. 这些动态生成和添加的View且少数状况下才使用到的View,这时候能够被释放,下次使用的时候再进行动态生成便可.好比原生桌面中,会在OnTrimMemory的TRIM_MEMORY_MODERATE等级中,释放全部AppsCustomizePagedView的资源,来保证在低内存的时候,桌面不会轻易被杀掉.
例子: 清除缓存
@Override
public void onTrimMemory(int level) {
if (level >= ComponentCallbacks2.TRIM_MEMORY_MODERATE) {
// Clear the caches. Note all pending requests will be removed too.
clear();
}
}
public void clear() {
mPendingRequests.clear();
mBitmapHolderCache.evictAll();
mBitmapCache.evictAll();
}
为何要调用OnTrimMemory?
尽管系统在内存不足的时候杀进程的顺序是按照LRU Cache中从低到高来的,可是它同时也会考虑杀掉那些占用内存较高的应用来让系统更快地得到更多的内存。
因此若是你的应用占用内存较小,就能够增长不被杀掉的概率,从而快速地恢复(若是不被杀掉,启动的时候就是热启动,不然就是冷启动,其速度差在2~3倍)。
因此说在几个不一样的OnTrimMemory回调中释放本身的UI资源,能够有效地提升用户体验。
http://mp.weixin.qq.com/s?__biz=MzAwNjE5MzA0NQ==&mid=211317365&idx=1&sn=c24d1be87cfe9e2ef341c2347dd5f61b&scene=1#rd