问题描述:
最近项目中出现了个Bug,打开应用程序按home键退出前台,启动其他的应用,经过一段时间再次启动自己的应用程序,发现界面中出现了数据丢失问题,导致程序出现一系列问题。
发现即使用Static 修饰的变量,也竟然被GC回收了,很纳闷这个问题。这问题在我调试的手机上没有发生过,但是测试人员描述,应用程序打开后,退出前台,一晚上过一段时间再次启动就出现这问题了。

分析:
分析测试描述,发现应用是在退出前台,再次进入前台出现的问题。考虑到这点想起了做毕业论文时候看过的一段话:
*在Android系统中,为了使系统能够正确决定内存不足时终止那个进程从而回收内存,Android会依据进程中当前活跃组件的重要程度来尽可能高的估量一个进程的级别,根据级别把进程装入“Importance Hierarchy(重要性分级)“中, “Importance Hierarchy”中的进程是按重要程度排序的。*
1.前台进程(Foreground)
前台进程是与用于进行交互的进程,在程序运行中仅有少量的进程处于前台,不同的组件会通过不同的方式将进程移植前台,当内存无法供给前台进程同时运行时候,部分前台进程才被杀死,用于维持用户界面响应。*
2.可见进程(Visible)
可见进程不在前台显示,但用户可以看到他的Activity,当一个Activity被调用onPause()方法时,它的进程就处于可见状态。可见进程一般不允许被终止,当前系统内存不足阻塞前台进程时,会终止可见进程释放内存供前台进程使用。
3.服务进程(Service)
服务进程是用户不可以直接看到进程,虽然用户不能看到该进程的执行,但该进程做着用户关心的问题,例如,在后台播放音乐。系统会一直维护该进程运行,除非系统内存不足时,无法维护前台进程和可见进程,系统将杀死该类进程。
4.后台进程(Background)
后台进程有一个用户看不到的Activity,该Activity的onStop()方法被系统调用,Activity处于停止状态,对用户的体验没有影响,系统可以在任何时刻杀死该类进程回收其内存供前台进程、可见进程、服务进程使用。系统中通常存在较多该进程保存在LRU中,当内存不足时系统回收LRU中用户最早使用的后台进程。
5.空进程(Empty)
该进程的设立是为了提高程序运行速度,组件再次运行时虚拟机不需要重新为组件分配内存。系统经常会杀死这种进程会杀死这种进程中优先级较低的进程以保持进程缓存和系统内核缓存之间的平衡。

现在很清楚,按home键,应用程序进程制为后台进程,调用Onstop() 方法,当系统内存不足的时候,GC会回收该进程中变量(即便变量的引用没有断开),从而导致数据丢失,但是Activity没有被 finish调,再次进入前天进程,就会出现数据丢失的现象。

Androidapp退出后自动重启 安卓app退出自动清除数据_Androidapp退出后自动重启

问题解决:
Activity 提供保存 数据的方法:
onSaveInstanceState(Bundle outState) 和onRestoreInstanceState(Bundle savedInstanceState)
onSaveInstanceState 调用情况:
1.按下或长按home键
2.横竖屏幕切换
3.该Activity 启动其他Activity
4.按下电源键
onRestoreInstanceState 调用情况:
当Activity退出前台,确实被系统销毁,会调用该方法,用户保存数据。
在 onCreate(Bundle savedInstanceState) 方法中可以进行数据的回复。

savedInstanceState 可以存储序列换的list
outState.putParcelableArrayList(“childList”, childList);
如何进行 Parcelable 参考