背景:
Android系统会自动回收退到后台的应用,我们可以运行一个后台Service,让我们的应用被回收的优先级变低,当时终归还是无法保证我们的进程被系统回收。
当系统被回收之后,我们缓存的一些数据也会被回收,当再次进入Activity的时候很可能会出现NULL指针异常。我们可以将数据持久化到本地,然后恢复Activity的时候从本地获取我们需要的数据。
有一些我们继承的第三方的sdk,当进程被回收之后,需要重新进行初始化,并不是简单的恢复数据就能解决的,这个时候我们可以考虑在进程被回收之后重新跳转到登陆界面进行重新登陆。
解决方案
当进程被回收再次进入到应用的时候,Activity的onCreate方法传入的savedInstanceState != null,平时进入的时候=null,我们可以根据这个进行判断是否结束该Activity,直到我们不需要结束的Activity。我这种方案,当你的应用通过savedInstanceState保存Activity的数据进行恢复的时候就不适用了。这个时候你可以根据Application中缓存的数据做为null判断 。
1、定义一个成员变量allowAutoFinish = true;
2、在BaseActivity中加入
@Override protected void onCreate(Bundle savedInstanceState) { //应用异常重启该Activity if(savedInstanceState != null){ if(allowAutoFinish){ finish(); } }
3、在不需要退出的Activity中加入
@Override protected void onCreate(Bundle savedInstanceState) { //当应用异常退出重启Activity时,不结束LoginActivity allowAutoFinish = false; super.onCreate(savedInstanceState); }
这样,当应用退出到后台,Application被回收之后,再次进入,就会直接回到登陆界面。
可以用DDMS中的kill process模拟进程被回收。也可以疯狂启动手机的应用,让应用背系统回收。