问题:
因为手机内存不足的时候,会回收一些APP所占内存,如果被回收的APP中有全局变量,那么再次进入这个APP就会导致异常报错;
原因:
因为Application是全局变量,内存不足的时候会被回收,这个时候如果不是重启而是恢复之前页面,系统会重新new一个Application,所以没有回收之前保存在Application中的信息都将没有了,所以回收之前保存在Application中的信息都将没有了,这个时候被恢复的页面就可能因为需要Application中的信息报NullPointerException错;
这说明:系统回收APP后,再次进入此软件,Android只是恢复这个应用,并不是重启,他会创建一个新的Application对象并且启动上次用户离开时的activity以造成这个APP从来没有被kill掉的假象;
什么是应用程序?
Application和Activity,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个Application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如何创建自己的Application,也可以简单创建一个类继承Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的Application名字注入即可)。
android系统会为每个程序运行创建一个Application类对象且仅创建一个,所有Application可以说是单例(singleton)模式的一个类,且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局单例的,所以不同Activity,Service中获取的对象都是同一个对象。所以通过Application来进行一些数据传输,数据共享,数据缓存等操作。
解决办法:
看了大多数都是onSaveInstanceState和OnRestoreInstanceState来保存UI状态的,基本上就是在按下Home键或者其他情况的时候存储数据,然后再次打开APP的时候读取bundle的数据,因为一般项目都有多个Activity,这样做比较麻烦。
这里将将一个简单粗暴的方法:Activity加载布局之前判断当前程序是否被系统回收,如何是则重新启动APP或者重新初始化全局变量;
具体代码如下:
1.创建一个类保存APP是否被回收的两个静态变量;
public class AppStatusConstant {
public static final int STATUS_FORCE_KILLED = -1; //应用放在后台被强杀了
public static final int STATUS_NORMAL = 1; //APP正常态
}
2.创建AppStatus的管理类,并初始APPStatus(APP状态)的值为被系统回收状态;
public class AppStatusManager implements Application.ActivityLifecycleCa