官术网_书友最值得收藏!

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)行增、刪、改、查操作。

主站蜘蛛池模板: 信丰县| 六安市| 中超| 札达县| 阜新市| 凤凰县| 嘉黎县| 霍林郭勒市| 温州市| 商丘市| 老河口市| 绥宁县| 富阳市| 和平区| 修武县| 曲沃县| 伊吾县| 德庆县| 汉中市| 香河县| 称多县| 双峰县| 安阳市| 侯马市| 扶绥县| 平利县| 阿尔山市| 恩施市| 金秀| 偃师市| 富民县| 屏东市| 闵行区| 万山特区| 嘉定区| 晋城| 辛集市| 阜城县| 林口县| 上犹县| 平原县|