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

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對全局變量進行增、刪、改、查操作。

主站蜘蛛池模板: 瓦房店市| 清丰县| 宁德市| 河间市| 北安市| 延川县| 双牌县| 垫江县| 日土县| 山阴县| 彭阳县| 西丰县| 南投市| 石棉县| 思南县| 湖口县| 高邑县| 永顺县| 瓦房店市| 丰宁| 阿克苏市| 历史| 清流县| 聂荣县| 白山市| 古蔺县| 阿拉善右旗| 达拉特旗| 潜江市| 五指山市| 金沙县| 哈巴河县| 年辖:市辖区| 闽清县| 始兴县| 绵阳市| 玉屏| 华安县| 凌云县| 安岳县| 延吉市|