書名: Android Studio開發實戰:從零基礎到App上線 (移動開發叢書)作者名: 歐陽燊本章字數: 1384字更新時間: 2020-11-28 17:31:44
4.4 Application基礎
本節介紹Android重要組件Application的基本概念和常見用法。首先說明Application的生命周期,接著利用Application的持久特性實現App內部全局內存中的數據保存和獲取。
4.4.1 Application的生命周期
Application是Android的一大組件,在App運行過程中有且僅有一個Application對象貫穿整個生命周期。打開AndroidManifest.xml時會發現activity節點的上級正是application節點,只是默認的application節點沒有指定name屬性,不像activity節點默認指定name屬性值為.MainActivity,讓人知曉這個activity的入口代碼是MainActivity.java?,F在我們給application節點加上name屬性,看看其廬山真面目。
(1)打開AndroidManifest.xml,給application節點加上name屬性,表示application的入口代碼是MainApplication.java。
android:name=".MainApplication"
(2)創建MainApplication類,該類繼承自Application,可以重寫的方法主要有以下4個。
● onCreate:在App啟動時調用。
● onTerminate:在App退出時調用(按字面意思)。
● onLowMemory:在低內存時調用。
● onConfigurationChanged:在配置改變時調用,例如從豎屏變為橫屏。
(3)運行App,同時開啟日志的打印。但是只在一開始看到MainApplication的onCreate操作(先于Activity的onCreate),卻始終無法看到它的onTerminate操作,無論是自行退出還是強行殺死App的進程,日志都不會打印onTerminate。
信不信,無論你怎么折騰,這個onTerminate都不會出來。Android明明提供了這個函數,同時提供了關于該函數的解釋,說明文字如下: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。這段話的意思是該方法是供模擬環境用的,在真機上永遠不會被調用,無論是直接殺進程還是代碼退出。
現在很明確了,onTerminate方法就是個擺設,中看不中用。如果讀者想在App退出前做資源回收操作,那么千萬不要放在onTerminate方法中。
4.4.2 利用Application操作全局變量
C/C++有全局變量,因為全局變量保存在內存中,所以操作全局變量就是操作內存,內存的讀寫速度遠比讀寫數據庫或讀寫文件快得多。全局的意思是其他代碼都可以引用該變量,因此全局變量是共享數據和消息傳遞的好幫手。不過,Java沒有全局變量的概念。與之比較接近的是類里面的靜態成員變量,該變量可被外部直接引用,并且在不同地方引用的值是一樣的(前提是在引用期間不能修改該變量的值),所以可以借助靜態成員變量實現類似全局變量的功能。
前面花費很大功夫介紹Application的生命周期,目的是說明其生命周期覆蓋App運行的全過程。不像短暫的Activity生命周期,只要進入別的頁面,原頁面就被停止或銷毀。因此,通過利用Application的持久存在性可以在Application對象中保存全局變量。
適合在Application中保存的全局變量主要有下面3類數據:
(1)會頻繁讀取的信息,如用戶名、手機號等。
(2)從網絡上獲取的臨時數據,為節約流量、減少用戶等待時間,想暫時放在內存中供下次使用,如logo、商品圖片等。
(3)容易因頻繁分配內存而導致內存泄漏的對象,如Handler對象等。
要想通過Application實現全局內存的讀寫,得完成以下3項工作:
(1)寫一個繼承自Application的類MainApplication。該類要采用單例模式,內部聲明自身類的一個靜態成員對象,在創建App時把自身賦值給這個靜態對象,然后提供該靜態對象的獲取方法getInstance。
(2)在Activity中調用MainApplication的getInstance方法,獲得MainApplication的一個靜態對象,通過該對象訪問MainApplication的公共變量和公共方法。
(3)不要忘了在AndroidManifest.xml中注冊新定義的Application類名,即在application節點中增加android:name屬性,值為.MainApplication。
下面繼續演示全局內存的讀寫效果,如圖4-15所示。App把注冊信息保存到MainApplication的全局變量中,然后在另一個頁面從MainApplication的全局變量中讀取保存好的注冊信息,如圖4-16所示。

圖4-15 注冊信息保存到全局內存

圖4-16 從全局內存讀取注冊信息
下面是自定義MainApplicaton類的代碼:
public class MainApplication extends Application { private static MainApplication mApp; public HashMap<String, String> mInfoMap = new HashMap<String, String>(); public static MainApplication getInstance() { return mApp; } @Override public void onCreate() { super.onCreate(); mApp = this; } }
完成以上編碼后,Activity頁面代碼即可直接通過MainApplication.getInstance().mInfoMap對全局變量進行增、刪、改、查操作。
- ASP.NET MVC4框架揭秘
- Moodle Administration Essentials
- 程序員數學:用Python學透線性代數和微積分
- C語言程序設計教程(第2版)
- ASP.NET Core 2 and Vue.js
- AngularJS深度剖析與最佳實踐
- Neo4j Essentials
- Internet of Things with Intel Galileo
- QGIS:Becoming a GIS Power User
- Android系統級深入開發
- Visual Foxpro 9.0數據庫程序設計教程
- Mastering Akka
- Cocos2d-x by Example:Beginner's Guide(Second Edition)
- Kotlin Programming By Example
- Web程序設計:ASP.NET(第2版)