- Android Studio開發(fā)實戰(zhàn):從零基礎(chǔ)到App上線(第2版)
- 歐陽燊
- 1342字
- 2019-12-06 12:07:28
4.4 應(yīng)用Application基礎(chǔ)
本節(jié)介紹Android重要組件Application的基本概念和常見用法。首先說明Application的生命周期,接著利用Application的持久特性實現(xiàn)App內(nèi)部全局內(nèi)存中的數(shù)據(jù)保存和獲取。
4.4.1 Application的生命周期
Application是Android的一大組件,在App運行過程中有且僅有一個Application對象貫穿整個生命周期。打開AndroidManifest.xml時會發(fā)現(xiàn)activity節(jié)點的上級正是application節(jié)點,只是默認(rèn)的application節(jié)點沒有指定name屬性,不像activity節(jié)點默認(rèn)指定name屬性值為.MainActivity,讓人知曉這個activity的入口代碼是MainActivity.java。現(xiàn)在試試給application節(jié)點加上name屬性,看看其廬山真面目。
(1)打開AndroidManifest.xml,給application節(jié)點加上name屬性,表示application的入口代碼是MainApplication.java。
android:name=".MainApplication"
(2)創(chuàng)建MainApplication類,該類繼承自Application,可以重寫的方法主要有以下4個。
- onCreate:在App啟動時調(diào)用。
- onTerminate:在App退出時調(diào)用(按字面意思)。
- onLowMemory:在低內(nèi)存時調(diào)用。
- onConfigurationChanged:在配置改變時調(diào)用,例如從豎屏變?yōu)闄M屏。
(3)運行App,同時開啟日志的打印。但是只在一開始看到MainApplication的onCreate操作(先于Activity的onCreate),卻始終無法看到它的onTerminate操作,無論是自行退出還是強行殺死App的進(jìn)程,日志都不會打印onTerminate。
無論你怎么折騰,這個onTerminate都不會出來。Android明明提供了這個函數(shù),同時提供了關(guān)于該函數(shù)的解釋,說明文字如下:This method is for use in emulated process environments.It will never be called on a production Android device, where processes are removed by simply killing them; no user code (including this callback) is executed when doing so。這段話的意思是該方法是供模擬環(huán)境用的,在真機上永遠(yuǎn)不會被調(diào)用,無論是直接殺進(jìn)程還是代碼退出。
現(xiàn)在很明確了,onTerminate方法就是個擺設(shè),中看不中用。如果讀者想在App退出前做資源回收操作,那么千萬不要放在onTerminate方法中。
4.4.2 利用Application操作全局變量
C/C++有全局變量,因為全局變量保存在內(nèi)存中,所以操作全局變量就是操作內(nèi)存,內(nèi)存的讀寫速度遠(yuǎn)比讀寫數(shù)據(jù)庫或讀寫文件快得多。全局的意思是其他代碼都可以引用該變量,因此全局變量是共享數(shù)據(jù)和消息傳遞的好幫手。不過,Java沒有全局變量的概念。與之比較接近的是類里面的靜態(tài)成員變量,該變量可被外部直接引用,并且在不同地方引用的值是一樣的(前提是在引用期間不能修改該變量的值),所以可以借助靜態(tài)成員變量實現(xiàn)類似全局變量的功能。
前面花費很大功夫介紹Application的生命周期,目的是說明其生命周期覆蓋App運行的全過程。不像短暫的Activity生命周期,只要進(jìn)入別的頁面,原頁面就被停止或銷毀。因此,通過利用Application的持久存在性可以在Application對象中保存全局變量。
適合在Application中保存的全局變量主要有下面3類數(shù)據(jù):
(1)會頻繁讀取的信息,如用戶名、手機號等。
(2)從網(wǎng)絡(luò)上獲取的臨時數(shù)據(jù),為節(jié)約流量、減少用戶等待時間,想暫時放在內(nèi)存中供下次使用,如logo、商品圖片等。
(3)容易因頻繁分配內(nèi)存而導(dǎo)致內(nèi)存泄漏的對象,如Handler對象等。
要想通過Application實現(xiàn)全局內(nèi)存的讀寫,得完成以下3項工作:
(1)寫一個繼承自Application的類MainApplication。該類要采用單例模式,內(nèi)部聲明自身類的一個靜態(tài)成員對象,在創(chuàng)建App時把自身賦值給這個靜態(tài)對象,然后提供該靜態(tài)對象的獲取方法getInstance。
(2)在Activity中調(diào)用MainApplication的getInstance方法,獲得MainApplication的一個靜態(tài)對象,通過該對象訪問MainApplication的公共變量和公共方法。
(3)不要忘了在AndroidManifest.xml中注冊新定義的Application類名,即在application節(jié)點中增加android:name屬性,值為.MainApplication。
下面繼續(xù)演示全局內(nèi)存的讀寫效果,如圖4-17所示。App把注冊信息保存到MainApplication的全局變量中,然后在另一個頁面從MainApplication的全局變量中讀取保存好的注冊信息,如圖4-18所示。

圖4-17 注冊信息保存到全局內(nèi)存

圖4-18 從全局內(nèi)存讀取注冊信息
下面是自定義MainApplicaton類的代碼框架:

完成以上編碼后,Activity頁面代碼即可直接通過MainApplication.getInstance().mInfoMap對全局變量進(jìn)行增、刪、改、查操作。
- 分布式系統(tǒng)常用技術(shù)及案例分析(第2版)
- FTTx PON技術(shù)與應(yīng)用
- 電子工藝與EDA
- 電子線路CAD與實訓(xùn)
- 基于集成學(xué)習(xí)的角反射體目標(biāo)雷達(dá)識別理論與方法
- 智慧城市:城市品質(zhì)新思維
- 電子產(chǎn)品調(diào)試技能上崗實訓(xùn)
- 電路基礎(chǔ)實驗與實踐
- 5G:2020后的移動通信
- 信息論與編碼原理
- 5G系統(tǒng)技術(shù)原理與實現(xiàn)
- 光纖通信技術(shù)及應(yīng)用
- WCDMA網(wǎng)絡(luò)測試與優(yōu)化教程
- 射頻與微波晶體管功率放大器工程
- 愛上單片機(第3版)