性能优化-OnTrimMemory

一、简述

OnTrimMemory是Andorid4.0以后推出的方法。先看看官方的介绍把。

性能优化-OnTrimMemory_第1张图片

翻译过来就是:当系统检测到内存较低时就会调用该方法,这时候适合程序去释放一些没用的资源。举个例子:当程序在后台时,而内存不足以维持这么多后台进程时,这个程序就会返回level,它代表当前可用内存等级,这时你可以对比这个等级而对应的做一些事。再简单点就是:指导应用程序在内存不同的情况下进行自身内存释放,以避免被系统直接杀掉,提高应用程序的用户体验。

只要实现了ComponentCallbacks2接口的类就是重写实现该回调方法。就是下面这个接口:

性能优化-OnTrimMemory_第2张图片

下面分别介绍一下level等级:

1、当应用程序是缓存时的回调等级:

(1)TRIM_MEMORY_BACKGROUND 表示手机目前内存已经很低了,系统准备开始根据LRU缓存来清理进程。这个时候我们的程序在LRU缓存列表的最近位置,是不太可能被清理掉的,但这时去释放掉一些比较容易恢复的资源能够让手机的内存变得比较充足,从而让我们的程序更长时间地保留在缓存当中,这样当用户返回我们的程序时会感觉非常顺畅,而不是经历了一次重新启动的过程。
(2)TRIM_MEMORY_MODERATE 表示手机目前内存已经很低了,并且我们的程序处于LRU缓存列表的中间位置,如果手机内存还得不到进一步释放的话,那么我们的程序就有被系统杀掉的风险了。
(3)TRIM_MEMORY_COMPLETE 表示手机目前内存已经很低了,并且我们的程序处于LRU缓存列表的最边缘位置,系统会最优先考虑杀掉我们的应用程序,在这个时候应当尽可能地把一切可以释放的东西都进行释放。

2、当应用程序真正运行时的回调等级:

(1)TRIM_MEMORY_RUNNING_MODERATE 表示应用程序正常运行,并且不会被杀掉。但是目前手机的内存已经有点低了,系统可能会开始根据LRU缓存规则来去杀死进程了。
(2)TRIM_MEMORY_RUNNING_LOW 表示应用程序正常运行,并且不会被杀掉。但是目前手机的内存已经非常低了,我们应该去释放掉一些不必要的资源以提升系统的性能,同时这也会直接影响到我们应用程序的性能。
(3)TRIM_MEMORY_RUNNING_CRITICAL 表示应用程序仍然正常运行,但是系统已经根据LRU缓存规则杀掉了大部分缓存的进程了。这个时候我们应当尽可能地去释放任何不必要的资源,不然的话系统可能会继续杀掉所有缓存中的进程,并且开始杀掉一些本来应当保持运行的进程,比如说后台运行的服务。 

3、当应用程序的所有UI界面被隐藏。

TRIM_MEMORY_UI_HIDDEN表示当用户点击了Home键或者Back键导致应用的UI界面不可见时,应该释放一些资源。

二、实现了该接口的组件:

1、Application.onTrimMemory()
2、Activity.onTrimMemory()
3、Fragement.OnTrimMemory()
4、Service.onTrimMemory()
5、ContentProvider.OnTrimMemory() 

三、为什么要使用该方法

尽管系统在内存不足的时候杀进程的顺序是按照LRU Cache中从低到高来的,但是它同时也会考虑杀掉那些占用内存较高的应用来让系统更快地获得更多的内存。 
所以如果你的应用占用内存较小,就可以增加不被杀掉的几率,从而快速地恢复(如果不被杀掉,启动的时候就是热启动,否则就是冷启动,其速度差在2~3倍)。 
所以说在几个不同的OnTrimMemory回调中释放自己的UI资源,可以有效地提高用户体验。

四、使用场景

1、常驻内存的应用 
一些常驻内存的应用,比如Launcher、安全中心、电话等,在用户使用过要退出的时候,需要调用OnTrimMemory来及时释放用户使用的时候所产生的多余的内存资源:比如动态生成的View、图片缓存、Fragment等。
2、有后台Service运行的应用 

这些应用不是常驻内存的,意味着可以被任务管理器杀掉,但是在某些场景下用户不会去杀。 

这类应用包括:音乐、下载等。用户退出UI界面后,音乐还在继续播放,下载程序还在运行。这时候音乐应该释放部分UI资源和Cache。

五、与OnLowMemory关系

android4.0以下使用OnLowMemory,4.0以上使用OnTrimMemory,OnLowMemory大概和OnTrimMemory中的TRIM_MEMORY_COMPLETE级别相同。






你可能感兴趣的:(性能优化)