Android系统用户可以在background应用,和forground应用快速的切换,background的应用能够迅速的切换到forground,每一个background的应用都会占用一定的内存。Android系统会根据当前的系统内存使用情况,决定回收部分background的应用内存,如果background的应用从暂停状态直接被恢复到前台,能够获得较快的恢复体验,如果background应用是从Kill的状态进行恢复,就会显得稍微有点慢。
android_perf_3_memory_bg_2_for.png.jpegAndroid系统会通过一些回调来通知forground和background应用当前内存的使用情况。
当所有的background应用都被kill掉的时候,forground应用会收到onLowMemory()的回调。
当系统内存达到某些条件的时候,所有正在运行的应用都会收到onTrimMemory()的回调。
onLowMemory是Android提供的API,在系统内存不足,所有后台程序都被杀死时,系统会调用OnLowMemory,当我们的应用收到onLowMemory()的时候,我们需要尽快的释放不必须使用的内存,保证我们的应用能够正常运行,不至OOM。
系统提供的onLowMemory有
Application.onLowMemory() Activity.OnLowMemory() Fragement.OnLowMemory() Service.OnLowMemory() ContentProvider.OnLowMemory()
当然我们也可以自己实现回调,然后通过Context注册。我们需要实现ComponentCallbacks,通过Context.registerComponentCallbacks ()注册。这样我们的类也可以收到这个回调,然后释放非必须的资源。
public class MyLowMemoryCallBack implements ComponentCallbacks {
@Override
public void onConfigurationChanged(Configuration newConfig) {
}
@Override
public void onLowMemory() {
}
}
onTrimMemory()当系统内存达到某些条件的时候,所有正在运行的应用都会收到这个回调,同时在这个回调里面会传递以下的参数,代表不同的内存使用情况。系统提供的onTrimMemory与onLowMemory回调相同,分别在Application,Activity,Fragment,Service和ContentProvider,我们也可以实现onTrimMemory,收到系统回调,我们需要实现的是ComponentCallbacks2,我们可以看到ComponentCallbacks2继承了ComponentCallbacks,只是增加了一个onTrimMemory,也是通过Context.registerComponentCallbacks()注册,就会被系统回调到。
public interface ComponentCallbacks2 extends ComponentCallbacks
屏幕快照 2016-01-20 下午5.58.00.png官方视频有两个是一样的,晕。
TRIM_MEMORY_RUNNING_MODERATE 正在运行并且不会被列为可杀死的。但是设备此时正运行于低内存状态下
TRIM_MEMORY_RUNNING_LOW 正在运行且没有被列为可杀死的。但是设备正运行于更低内存的状态下,你应该释放不用的资源用来提升系统性能(但是这也会直接影响到你的app的性能)
TRIM_MEMORY_RUNNING_CRITICAL 仍在运行,但是系统已经把后台中的大多数进程都已经杀死,因此你应该立即释放所有非必须的资源。
TRIM_MEMORY_UI_HIDDEN 内存不足,并且该进程的UI已经不可见了,这是需要释放大的UI资源
TRIM_MEMORY_BACKGROUND 内存不足,并且该进程是后台进程,不是处于被杀掉的危险状态
TRIM_MEMORY_MODERATE 内存不足,并且该进程在后台进程列表的中部,你的进程是有可能被杀死
TRIM_MEMORY_COMPLETE 内存不足,并且该进程在后台进程列表最后一个,马上就要被清理
为什么要调用OnTrimMemory?
尽管系统在内存不足的时候杀进程的顺序是按照LRU Cache中从低到高来的,但是它同时也会考虑杀掉那些占用内存较高的应用来让系统更快地获得更多的内存。
所以如果你的应用占用内存较小,就可以增加不被杀掉的几率,从而快速地恢复(如果不被杀掉,启动的时候就是热启动,否则就是冷启动,其速度差在2~3倍)。
所以说在几个不同的OnTrimMemory回调中释放自己的UI资源,可以有效地提高用户体验。
Android 4.4开始,ActivityManager提供了isLowRamDevice()的API,通常指的是Heap Size低于512M或者屏幕大小<=800*480的设备,isLowRamDevice()用于应用程序运行时能检测系统内存规格,并决定是否选择Low-Memory功能,以适配一些低内存的设备。
网友评论