一個問題,哪種方法更好很大程度上取決於你存儲什麼樣的信息,並需要獲得和誰(哪個部件,包等)需要訪問這些信息。此外,像launchMode
和configChanges
這樣的設置會改變生命週期,可以幫助您確定哪種方法最適合您。首先,讓我注意到,我是擴展Application對象的一個巨大倡導者,並且經常擴展Application類,但是在上下文中將所有的東西都放在它的上下文中,因爲重要的是要明白在某些情況下它只是簡單的不利於。
在應用程序的生命週期中: Chubbard大多正確地聲明應用程序具有與Singleton組件相同的生命。儘管它們非常接近,但還是有一些細微的差別。應用程序本身作爲操作系統的單例處理,只要任何組件處於活動狀態,包括AppWidget(可能存在於另一個應用程序中)或ContentResolver中,它都處於活動狀態。
所有組件最終都會訪問同一個對象,即使它們位於多個任務或進程中。但是,這並不能保證永遠保持這種狀態(因爲應用程序並非實際上是一個Singleton),並且只能在Google Android中得到保證,而不是製造商被覆蓋的版本。這意味着某些事情應該在應用程序對象中小心處理。
你Application
對象不會死,除非所有的組件被殺害也是如此。但是,Android可以選擇殺死任何數量的組件。這意味着您永遠不能保證有一個Application
對象,但是如果您的任何組件都處於活動狀態,則會有一個Application
將其關聯到。
另一個好處約Application
的是,它不extricably綁定到正在運行的組件。儘管如此,你的組件是綁定的,這使得它非常有用。
相近的應用程序對象避免:
- 按ususal,避免靜電
Context
秒。實際上,通常情況下,您不應該在此存儲Context
,因爲Application
本身就是Context
。
- 這裏的大多數方法都應該是靜態的,因爲不能保證得到相同的
Application
對象,即使它很可能。
- 如果您覆蓋
Application
,則此處存儲的數據和方法類型將幫助您進一步確定是否需要製作Singleton組件。
Drawables
及其衍生物是最有可能「泄漏」如果不是照顧,所以也建議它您避免引用Drawables
這裏。
- 運行狀態任何單個組件的狀態。這是因爲,您不能保證獲得相同的
Application
對象。此外,此處不存在Activity
中發生的生命週期事件。
相近的(超過束)
的Application
是存儲必須的組件之間共享數據和方法的真棒的地方,特別是如果你有多個入口點的應用程序商店(多個組件可以啓動並從發射活動開始運行)。例如,在我的所有Application
中,我放置了我的DEBUG標記和日誌代碼。
如果你有一個的ContentProvider或廣播接收器,這使得Application
更加理想,因爲這些有小生命週期是不是「可再生能源」之類的Activity
或AppWidgetProvider
,現在可以訪問這些數據或方法。
首選項用於確定通常在多次運行中運行選項,因此這可以是一個很好的地方來處理您的SharedPreferences
,例如,一個訪問而不是每個組件一個訪問。事實上,跨多次運行「堅持」的任何事情都很適合在這裏訪問。
最後,一個被忽視的優勢是你可以在這裏存儲和組織你的常量,而不必加載其他類或對象,因爲如果你的組件之一是Application
,它總是運行。這對於意圖操作和異常消息以及其他類似常量類型特別有用。
需要在Bundle中存儲的東西而不是應用程序 運行時狀態取決於單個組件或單個組件運行的存在或狀態。另外,任何依賴於顯示狀態,方向或類似的Android服務的東西在這裏都是不可取的。這是因爲Application
從未被通知過這些更改。最後,任何依賴Android系統通知的東西都不應該放在這裏,比如對生命週期事件的反應。
而且....別處
至於那需要保留的其他數據,你總是有數據庫,網絡服務器和文件系統。像你以往一樣使用它們。
作爲Application
是有用的和被忽視的,一個很好的理解是重要的,因爲它是不理想的。希望這些說明能夠讓你對大師爲什麼鼓勵一種方式有所瞭解。瞭解許多開發人員都有類似的需求,大部分的指導都是基於大多數社區擁有的技術和知識。 Google所說的並不適用於所有程序員的需求,並且有理由認爲該應用程序未被宣佈爲Final
。
請記住,Android需要能夠殺死你的組件是有原因的。主要原因是內存,而不是處理。通過使用上述應用程序並開發適當的方法來保存適當的信息,您可以構建更強大的應用程序,以體貼系統,用戶,其兄弟組件和其他開發人員。利用這裏提供的每個人的信息應該給你一些關於如何以及何時擴展Application
的很好的指導。
希望這有助於 FuzzicalLogic
鑑於你的描述我會完全支持你們的編輯同意。 –
真棒,謝謝! –
沒問題。就像這裏所有人強調的一樣,這取決於它如何被全部使用。您的示例非常棒,因爲它將運行時數據從運行時狀態移開,並允許組件根據該數據發起操作,而不是事件。 –