complete tap ext 官方 point override tail context
通常我称系统为了维持当前 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,在这个里面处理退出程序操作。
其他方法:
例如:把配置文件保存到数据库、保存到本地文件等等方法。缺点就是读取耗时间,不建议使用。
Android 内存重启之静态变量被回收导致 nullPoint 问题
来源: http://www.bubuko.com/infodetail-2213228.html