【 不用靜態(tài)變量存儲數(shù)據(jù) 】
1、靜態(tài)變量等數(shù)據(jù)由于進(jìn)程已經(jīng)被殺死而被初始化宝泵。
2亲桥、使用其他暑假傳輸方式:文件 / sp / contentProvider片酝。
【 有關(guān)sp的安全問題 】
不能跨進(jìn)程同步;存儲SP的文件過大問題眷射;
盡量不要去做跨進(jìn)程的東西匙赞,這非常會影響數(shù)據(jù)的安全問題恋追。
【 Context的種類及注意事項 】
Application:Android應(yīng)用中默認(rèn)單例類,在Activity或Service中通過getApplication()可以獲取到這個單例罚屋,通過context.getApplicationContext()可以獲取到應(yīng)用全局唯一的Context實例苦囱。
Activity/Service:都是ContextWrapper的子類,在這兩個類中可以通過getBaseContext()獲取到它們的Context實例脾猛,不同的Activity或Service實例撕彤,它們的Context都是獨立的,不會復(fù)用猛拴。
BroadcastReceiver:本身不是Context的子類羹铅,而是在回掉函數(shù)onReceive()中由Android框架傳入一個Context的實例。系統(tǒng)傳入的這個Context實例是經(jīng)過功能裁剪的愉昆,它不能調(diào)用registerReceiver()以及bindService()這兩個函數(shù)职员。
ContentProvider:也不是Context的子類,但在創(chuàng)建時系統(tǒng)會傳入一個Context實例跛溉,這樣在CP中可以通過調(diào)用getContext()函數(shù)獲取焊切,如果CP和調(diào)用者處于相同的應(yīng)用進(jìn)程中,那么getContext()將返回應(yīng)用全局唯一的Context實例芳室。如果是其他進(jìn)程調(diào)用的CP专肪,那么CP將持有自身所在的進(jìn)程的Context實例。
getApplicationContext():Application的Context, 生命周期貫穿整個App堪侯。 ? ? ? ? ? ? ? ? getContext() / this:組件的Context嚎尤,與組件生命周期同步。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? getBaseContext():(Google Android 工程師Dianne Hackborn 不建議使用伍宦,具體原因沒詳述)芽死。
【 使用建議 】
?數(shù)字1:啟動Activity在這些類中是可以的,但是需要創(chuàng)建一個新的task次洼。一般情況不推薦关贵。
?數(shù)字2:在這些類中去layout inflate是合法的,但是會使用系統(tǒng)默認(rèn)的主題樣式滓玖,如果你自定義了某些樣式可能不會被使用坪哄。 ?
數(shù)字3:在receiver為null時允許,在4.2或以上的版本中势篡,用于獲取黏性廣播的當(dāng)前值。(可以無視)模暗。
【 注意Context引用的持有禁悠,防止內(nèi)存泄漏 】
建議一:不要長時間持有 組件的Context,(持有的情況可能有 workThread, static 變量兑宇,non-static inner Class)碍侦。
建議二:對于不受控的非靜態(tài)內(nèi)部類,建議修改成靜態(tài)內(nèi)部類,同時采用弱引用的方式 引用 Activity/Service 的Context瓷产。
建議三:其他可以使用Application Context 的地方站玄,就用Application Context。