class MyApplication : Application(){
//应用创建时调用
override fun onCreate() {
super.onCreate()
}
//在低内存时被调用
override fun onLowMemory() {
super.onLowMemory()
}
//程序终止的时候被调用,该函数不一定会执行,
//或者说不会在真机环境下被执行,通过该方法的注释,我们可以得知
//该方法只有在模拟器环境下才会被执行
override fun onTerminate() {
super.onTerminate()
}
//程序在内存清理的时候被执行
override fun onTrimMemory(level: Int) {
super.onTrimMemory(level)
}
//系统设置被修改时调用
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
}
}
这里比较有意思的是onLowMemory与OnTrimMemory方法
OnLowMemory
在系统内存不足,所有后台程序都被杀死时,系统会调用OnLowMemory。
该方法在Application、Activity、Fragment、Service、ContentProvider中均有提供。
同时,我们还可以通过实现ComponentCallBacks,并使用Context::registerComponentCallbacks()注册该回调
该方法使用上比较灵活,不需要局限在系统组件中才可以使用
OnTrimMemory(int level)
该方法是Android4.0以后提供的api,系统会根据不同的内存状态来回调。该方法主要作用的提示开发者在系统内存不足的时候,通过处理部分资源来释放内存。
该方法在Application、Activity、Fragment、Service、ContentProvider中均有提供。
onTrimMemory的参数是一个int值,代表不同的内存状态
TRIM_MEMORY_COMPLETE(80):内存不足,并且该进程是在后台进程列表最后一个,马上就要被清理掉了。表示手机目前内存已经很低了,并且我们的程序处于LRU缓存列表的最边缘位置,系统会最优先考虑杀掉我们的应用程序,在这个时候尽可能地把一切可以释放的东西都进行释放。
TRIM_MEMORY_MODERATE(60):内存不足,并且该进程在后台进程列表的中部,表示手机目前内存已经很低了,如果手机内存还得不到进一步的释放的话,那么程序就有被系统杀掉的风险了。
TRIM_MEMORY_BACKGROUND(40):内存不足,并且该进程是后台进程。系统开始根据LRU缓存来清理进程。这个时候我们的程序在LRU缓存列表的最近位置,不太可能被清理掉。不过建议释放一些比较容易恢复的资源,让手机内存变得比较充足。
TRIM_MEMORY_UI_HIDDEN(20):内存不足,并且该进程的UI已经不见了。即用户点击的HOME键或者BACK导致UI界面不可见。
4.1新增的
TRIM_MEMORY_RUNNING_CRITICAL(15):内存不足,并且该进程的优先级比较高,应用程序仍然能正常运行,但是系统需要清理内存,此时系统已经根据LRU缓存规则杀掉了大部分缓存的进程了。如果内存还是不足,系统可能会继续杀掉缓存中的进程,并且开始杀掉本应该保持运行的进程,比如说后台运行的服务。
TRIM_MEMORY_RUNNING_LOW(10):内存不足,并且该进程的优先级比较高,应用程序仍然能正常运行,但是目前手机内存已经非常低了,可能会影响到应用程序的性能
TRIM_MEMORY_RUNNING_MODERATE(5):内存不足,并且该进程优先级比较高,需要 清理内存 表示应用程序正常运行,并且不会被杀掉。但是目 前手机的内存已经有点低了,系统可能会开始根据LRU缓存规 则来杀死进程了。
1)当我们的应用程序真正运行时的回调:
TRIM_MEMORY_RUNNING_MODERATE(5)
TRIM_MEMORY_RUNNING_LOW(10)
TRIM_MEMORY_RUNNING_CRITICAL(15)
2)当应用程序是缓存的,则会收到以下几种类型的回调:
TRIM_MEMORY_BACKGROUND(40) (处于LRU缓存列表的最近位置)
TRIM_MEMORY_MODERATE(60) (处于LRU缓存列表的中间位置)
TRIM_MEMORY_COMPLETE(80) (处于LRU缓存列表的最边缘位置)
系统也提供了一个ComponentCallbacks2,任何实现了ComponentCallbacks2接口的类都可以重写实现这个回调方 法。
通过Context::registerComponentCallbacks()注册后,就会被系统回调到。
OnLowMemory与OnTrimMemory比较
1)OnLowMemory被回调时,已经没有后台进程了(已经全部被杀死了);而onTrimMemory被回调时,还有后台进 程。
2)OnLowMemory是在最后一个后台进程被杀时调用,一般情况是low memory killer 杀进程后触发;
而OnTrimMemory的触发更频繁,每次计算进程优先级时,只要满足条件,都会触发。
3)通过一键清理后,OnLowMemory不会被触发,而OnTrimMemory会被触发一次。
4)在引入OnTrimMemory之前都是使用OnLowMemory回调,需要知道的是,OnLowMemory大概和 OnTrimMemory中的 TRIM_MEMORY_COMPLETE级别相同,如果你想兼容api<14的机器,那么可以用 OnLowMemory来实现,否则你可以忽略OnLowMemory,直接使用OnTrimMemory即可.