我們在開發 Android app 時,最常用到的元件非 Context 莫屬了,但它也最有可能會被誤用。假設現在定義了一個 singleton,需要傳入 Context 來做後續如載入 resources 之類的工作,並且會將這個 reference 存下來。
這時會造成一個問題,我們不知道這個 Context 的來源是什麼,而如果來源是 Activity 或 Service,那我們扣著這個 reference 也是不安全的。原因在於為了維持這個 static reference,那與它相關聯的所有物件就不會被回收,如果這個 Context 來源是 Activity,這就意味著連同在這個 Activity 裡面的 View 以及各種物件都會被扣著,增加 memory leak 的風險。為了避免這個情況,我們可以調整 reference 到 Application Context 身上。
這樣我們便不用顧慮 Context 來源是什麼,因為 Application Context 本身就是 singleton,不需要再花資源建另外一個 static reference。
那我們為什麼不乾脆都只 reference 到 Application Context 身上就好了呢?那是因為有些功能不適合由 Application Context 執行,最主要的就是 UI 行為,例如 Layout Inflation,而執行 UI 功能最適合的人選就是 Activity,一般來說這些功能原本也就被設計在 Activity 內運作。
Reference:
http://possiblemobile.com/2013/06/context/
沒有留言:
張貼留言