我們都知道Application是虛擬機(jī)下全局單實(shí)例的折剃。我們可能在初級(jí)的時(shí)候在繼承Application下緩存一些數(shù)據(jù)。例如:
class MyApplication extends Application{
private String userName;
public void setUserName(String name){
userName=name;
}
public String getUserName(){
return userName;
}
}
我們?cè)谧远x的Application下面定義了玩家姓名,然后在登錄界面登錄成功之后調(diào)用MyApplication#setUserName(String name).進(jìn)行賦值操作。最后在用戶信息Activity夫晌,調(diào)用MyApplication#getUserName()進(jìn)行展示读第。看上去似乎沒有什么問題。
但是這里存在一個(gè)問題攒巍。
如果 手機(jī)用戶按了Home按鍵離開了該APP嗽仪;
數(shù)小時(shí)之后,系統(tǒng)由于內(nèi)存不足(用戶在體驗(yàn)其它APP呢柒莉,前臺(tái)的任務(wù)總是優(yōu)先的嘛)會(huì)在后臺(tái)將你的程序殺掉闻坚;在你重新啟動(dòng)該APP之前一切看上去很好,但是.....兢孝;
用戶重新打開了這個(gè)APP窿凤;
Android會(huì)重新創(chuàng)建一個(gè)之前被Kill掉的MyApplication實(shí)例并恢復(fù)用戶信息Activity;
用戶信息Activity去獲取用戶名時(shí)跨蟹,會(huì)因?yàn)楂@取的為空值報(bào)NullPointerException而崩潰掉雳殊。
重點(diǎn)來了!4靶:煌骸!
導(dǎo)致這個(gè)問題的主要原因是:Application對(duì)象并不是始終在內(nèi)存中的痢艺,它有可能會(huì)由于系統(tǒng)內(nèi)存不足而被殺掉仓洼。但Android在你恢復(fù)這個(gè)應(yīng)用時(shí)并不是重新開始啟動(dòng)這個(gè)應(yīng)用,它會(huì)創(chuàng)建一個(gè)新的Application對(duì)象并且啟動(dòng)上次用戶離開時(shí)的activity以造成這個(gè)app從來沒有被kill掉得假象堤舒。
PS:
今天在看<阿里巴巴android開發(fā)手冊(cè)> 看到[強(qiáng)制]不在Application緩存數(shù)據(jù)色建。我想到以前自己就這么干過了,所以搜索一下為什么不能這么做舌缤。在這里記錄與分享箕戳。
多問為什么?技術(shù)進(jìn)步更快国撵,不是嗎陵吸?
參考資料:
1.<阿里android開發(fā)手冊(cè)> https://edu.aliyun.com/certification/cldt04
2.https://blog.csdn.net/qq_16618813/article/details/51111369