安卓Application生命周期

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即可.
 

发布了24 篇原创文章 · 获赞 2 · 访问量 8185

猜你喜欢

转载自blog.csdn.net/Dragonlongbo/article/details/105399175
今日推荐