内存不足导致应用进程被杀

版权声明:本文为博主原创文章,转载请注明出处(http://blog.csdn.net/jaden_hool) https://blog.csdn.net/Jaden_hool/article/details/78617685

应用处于后台时,如果手机内存不足,应用进程会被强制杀掉. 如果通过最近打开的应用列表回到应用,那么首先会调起Application, 然后会恢复被杀之前的Activity, 如果Activity中含有Fragment, 那么Fragment也会被创建新的实例,但是应用中的其他单例等数据就会被清除。

生命周期

Android的组件都是有生命周期的,与用户交互的Activity和Fragment都有明确的生命周期。编写代码的时候尽量少用单例模式,单例模式的优点很明显:易于共享数据。但是单例模式没有生命周期,不能跟随Activity创建、销毁。

内存不足时会发生什么

当手机内存不足时,系统会根据每个应用的状态按优先级依次销毁应用的进程,以保证优先级高的应用能得到充足的内存。

如果应用在后台,如果系统内存不足,导致应用进程被杀。那么应用中所有在内存中的数据将会被清理,而且系统会保存当前应用的Activity栈信息。

应用进程被杀后,如果从桌面ICON重启,那么应用会像常规启动一样重启,一切都会很正常;如果从最近使用的应用列表中重启,那么系统会根据保存的Activity栈首先恢复栈顶的Activity, 如果用户不断返回上层,那么系统也会依次恢复Activity栈中的所有Activity, 如果含有Fragment, 那么Fragment的实例也会被系统自动创建。当然,不管用哪种方式返回应用,都会先启动Application。

应用重启后的数据恢复

Activity中持有的少量数据可以通过onSaveInstanceStateonCreate方法形参中的Bundle进行存储和恢复。如果使用了单例保存数据,那么重启后单例的数据就不复存在,所以要评估使用单例的风险。参考文章

遇到的问题

问题:应用中有大量情况使用了单例,而且单例中保存的数据很重要。

方案:在BaseActivity中代理子Activity的生命周期方法,Activity创建时,根据全局变量判断应用是否是被杀后重启,如果是,不调用子Activity的任何方法,直接启动LaunchActivity, 产生应用重新启动的现象,单例也就都会重新被创建。(方法很山寨,万不得已不要用)参考文章

问题:含有Fragment的Activity,使用MVP模式,应用被杀重启后没有重新创建Presenter。

方案:在Activity的OnCreate中,一定要创建Presenter的实例,不管Fragment是否为null, 都要创建Presenter. 因为应用被杀重启的情况下,内存中的Presenter实例已经被销毁,但是Fragment对象会被系统自行创建,所以在Activity#onCreate方法中会出现Fragment不为null, 但是Presenter为null的现象。

测试

模拟应用由于内存不足被杀有很多种方法,大家可以参考这篇文章,讲得很全。

猜你喜欢

转载自blog.csdn.net/Jaden_hool/article/details/78617685