通常我称系统为了维持当前app运行稳定而进行内存清场动作导致后台app被强制清理的情况成为内存重启。
那么内存重启会导致的一个问题就是app被杀掉之后对应的静态变量也会被同时清理掉。那么怎么解决这个问题呢。
据我研究可以使用这么几个方法:
方法一:
//activity销毁之前保存配置信息,防止静态变量数据丢失 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //这里保存Parcelable(序列化)后的config对象 outState.putParcelable("config",config); } //activity恢复的时候恢复保存的数据 @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); ////这里恢复config对象 config=savedInstanceState.getParcelable("config"); }
方法二:
根据Google官方的推荐以及百度到的各位大神的推荐,我们应该尽量使用继承自Application的自定义类,在我们继承的类中定义需要全局使用的变量,并通过getApplicationContext()来获取和保存相关的变量即可。
具体代码参考http://blog.csdn.net/weihan1314/article/details/8033052
方法三:
监测到Activity快被系统回收的时候,应用自杀。你想想反正横竖都是死,与其被系统杀死并报异常,不如自杀,18年后又是一条好汉。
用户打开应用,重新加载静态变量,这是保险粗暴又安全的方法。
/** * 内存不够时 * @param level */ @Override public void onTrimMemory(int level) { super.onTrimMemory(level); if (level == TRIM_MEMORY_MODERATE) { //开始自杀,清场掉所有的activity
//下面这个是自己写的方法
((TMDApplication) getApplication()).destroyAllData(null);
} }
附录:内存级别等级
TRIM_MEMORY_COMPLETE:内存不足,并且该进程在后台进程列表最后一个,马上就要被清理
TRIM_MEMORY_MODERATE:内存不足,并且该进程在后台进程列表的中部。
TRIM_MEMORY_BACKGROUND:内存不足,并且该进程是后台进程。
TRIM_MEMORY_UI_HIDDEN:内存不足,并且该进程的UI已经不可见了
TRIM_MEMORY_COMPLETE这个监听的时候有时候监听不到,建议监听TRIM_MEMORY_MODERATE,在这个里面处理退出程序操作。
其他方法:
例如:把配置文件保存到数据库、保存到本地文件等等方法。缺点就是读取耗时间,不建议使用。