我们都知道Application是虚拟机下全局单实例的。我们可能在初级的时候在继承Application下缓存一些数据。例如:
class MyApplication extends Application{
private String userName;
public void setUserName(String name){
userName=name;
}
public String getUserName(){
return userName;
}
}
我们在自定义的Application下面定义了玩家姓名,然后在登录界面登录成功之后调用MyApplication#setUserName(String name).进行赋值操作。最后在用户信息Activity,调用MyApplication#getUserName()进行展示。看上去似乎没有什么问题。
但是这里存在一个问题。
如果 手机用户按了Home按键离开了该APP;
数小时之后,系统由于内存不足(用户在体验其它APP呢,前台的任务总是优先的嘛)会在后台将你的程序杀掉;在你重新启动该APP之前一切看上去很好,但是.....;
用户重新打开了这个APP;
Android会重新创建一个之前被Kill掉的MyApplication实例并恢复用户信息Activity;
用户信息Activity去获取用户名时,会因为获取的为空值报NullPointerException而崩溃掉。
重点来了!!!!
导致这个问题的主要原因是:Application对象并不是始终在内存中的,它有可能会由于系统内存不足而被杀掉。但Android在你恢复这个应用时并不是重新开始启动这个应用,它会创建一个新的Application对象并且启动上次用户离开时的activity以造成这个app从来没有被kill掉得假象。
PS:
今天在看<阿里巴巴android开发手册> 看到[强制]不在Application缓存数据。我想到以前自己就这么干过了,所以搜索一下为什么不能这么做。在这里记录与分享。
多问为什么?技术进步更快,不是吗?
参考资料:
1.<阿里android开发手册> https://edu.aliyun.com/certification/cldt04
2.https://blog.csdn.net/qq_16618813/article/details/51111369