說到全局變量,可能在教科書里面都不建議我們使用,但是在實際開發過程中,會發現全局變量其實帶來了很大的便捷性。雖然Android在不同的Activity切換時可以把要傳遞的值傳到Intent里面(iOS中也有類似的方法),但是當我們應用的頁面很多,邏輯漸漸復雜了之后,全局變量就帶來了非常大的便利。
我個人總結了之后,把全局變量分成了兩大類:
-
程序生命周期之外的全局變量
這種全局變量當程序被kill了之后,依舊可以保存下來,當程序下次啟動的時候,依然有效。最常見的就是用戶名、密碼之類的了。當然,如果你要保存的數據非常多,而且數據量比較大,就需要用輕量級的數據庫來保存了。
-
生命周期之內的全局變量
顧名思義,當程序被kill之后,下次啟動了之后,這些變量就被重新初始化,這些變量只在此次生命周期之內有效。最常見的就是頁面之間要傳遞的參數了,這些參數並不需要在程序被強制結束之后依舊保存。
我們就分類來看吧!
生命周期之外的全局變量
一般來說,這類全局變量不會很多,如果很多的話,就要使用sqlite等數據庫了,所以,我的這些全局變量是放在你自己定義的一個公共方法類(我的命名為CommonUtil
)里面的,這個類一般都是自定義的,不繼承自任何類。在這個類里面,我們定義下面的成對的方法來設置和獲取全局變量。
1 |
/** |
注:
- 必須通過
Context
提供的getSharedPreferences(String, int)
來獲得實例。該方法的第一個參數是指定XML文件名(不包含“.xml”后綴)的字符串,方法會去讀取出對應的文件,創建一個SharedPreferences對象。第二個參數指定文件的訪問權限,共有4中可選模式,從API 17開始基於安全的考慮,MODE_WORLD_READABLE
和MODE_WORLD_WRITEABLE
已經被廢棄使用,只有MODE_PRIVATE
和MODE_MULTI_PROCESS
可使用,一般情況下指定MODE_PRIVATE
即可。 - 這里的
Context
我一般是建議選擇整個Application
的context,而不是某一個Activity
的context,因為整個application的context生命周期在大多數情況下要長於特定的activity的context。至於如何獲取,很簡單一個函數getApplicationContext()
- 我這里的context其實是我自定義的類中的一個static成員變量,在程序初次加載的時候,就把application的context賦予它,我們也可以在函數的形參中賦值進去。
SharedPreferences
所能存儲的類型被限定在了String
、int
、long
、float
、boolean
這些基礎數據類中,唯一的集合類型也只是Set<String>
,而它看起來更像是用來作為不能有重復數據的數組。
生命周期內的全局變量
在上一篇Blog中也有用到這里的內容,一般來說,生命周期內的全局變量可以有很多,不同頁面之間傳遞或者有交叉使用的變量都可以放進來,所以我們通常也另外寫一個單獨的類,只不過和第一種不一樣,這個類需要繼承自Application
類
1 |
|
只要用到的,我們都可以繼續在這個類里面繼續補充。
當然,我們的AndroidManifest
文件中也要做相應的修改。
1 |
<application |
添加android:name=".Utils.CommonVariables"
屬性