爲什麼Android不建議activity之間用static傳值

一般來說,在Android開發中都會用intent來傳值,但是遇到數據量很大的時候,可能還要序列化纔可以,這樣反而增加了開銷,爲什麼不直接用static來傳值呢?
如果在activity中寫一個static變量來訪問的話,這是大忌,可能導致該activity不能被回收,造成內存泄漏。那如果我新開一個類專門用來傳遞static變量呢?
答案也是不行!
首先靜態變量不容易被回收,伴隨着整個進程,如果當成局部變量來使用,沒有及時釋放的話,反而帶來性能開銷。這篇文章Java方法區、棧及堆對於變量的存放寫的非常清楚。
更嚴重的是,靜態變量可能會丟失。Android是用Java開發,其靜態變量的生命週期遵守Java的設計。我們知道靜態變量是在類被load的時候分配內存的,並且存在於方法區。當類被卸載的時候,靜態變量被銷燬。在PC機的客戶端程序中,一個類被加載和卸載,可簡單的等同於jvm進程的啓動和結束。那麼在Android中呢?用的Dalvik vm也是一樣的。

  • 一、靜態變量在類被加載的時候分配內存。
    類在什麼時候被加載? 當我們啓動一個app的時候,系統會創建一個進程,此進程會加載一個Dalvik VM的實例,然後代碼就運行在DVM之上,類的加載和卸載,垃圾回收等事情都由DVM負責。也就是說在進程啓動的時候,類被加載,靜態變量被分配內存。
  • 二、靜態變量在類被卸載的時候銷燬。
  • 類在什麼時候被卸載? 在進程結束的時候。 說明:一般情況下,所有的類都是默認的ClassLoader加載的,只要ClassLoader存在,類就不會被卸載,而默認的ClassLoader生命週期是與進程一致的,本文討論一般情況。
  • 三、Android中的進程什麼時候結束
  • 這個是Android對進程和內存管理不同於PC的核心——如果資源足夠,Android不會殺掉任何進程,另一個意思就是進程隨時可能會被殺掉。而Android會在資源夠的時候,重啓被殺掉的進程。也就是說靜態變量的值,如果不做處理,是不可靠的,可以說內存中的一切都不可靠。如果要可靠,還是得保存到Nand或SD卡中去,在重啓的時候恢復回來。 另一種情況就是不能把退出所有Activity等同於進程的退出,所以在用戶點擊圖標啓動應用的時候,以前存放於靜態變量中的值,有可能還存在,因此要視具體情況給予清空操作。

一個場景如下:app home 切到後臺,長時間後 app 進程被系統回收掉,然後我們喚起這個 app ,這時 app 進程會重新啓動,但是頁面的啓動不會走默認的流程,而是會直接打開上次離開時的頁面,所以我這個執行初始化的 FlashActivity 沒機會跑了,所以這個 static 變量就會爲 null,這種情況是進程被系統回收之後纔會出現的,我們自己關閉進程沒事。

參考:
Android靜態變量的生命週期
android static 變量丟失的處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章