Android中Application類的詳細解釋:,androidapplication
Android中Application類的詳細解釋:
我們在平時的開發中,有時候可能會需要一些全域資料,來讓應用中的所有Activity和View都能訪問到,大家在遇到這種情況時,可能首先會想到自己定義一個類,然後建立很多靜態成員。
但是這種方法不符合Android的架構架構,不過andorid已經為我們提供了這種情況的解決方案:在Android中,有一個名為Application的類,我們可以在Activity中使用getApplication(),方法來獲得,它是代表我們的應用程式的類,使用它可以獲得當前應用的主題,資源檔中的內容等,這個類更靈活的一個特性就是可以被我們繼承,來添加我們自己的全域屬性。讓整個App的Activity和View都能訪問到。
1.概念:
android系統會為每個程式運行時建立一個Application類的對象且僅建立一個,所以Application可以說是單例 (singleton)模式的一個類.且application對象的生命週期是整個程式中最長的,它的生命週期就等於這個程式的生命週期。因為它是全域的單例的,所以在不同的Activity,Service中獲得的對象都是同一個對象。所以通過Application來進行一些,資料傳遞,資料共用,資料緩衝等操作。
2.作用:
(1).Application是一個基類,這個基類的作用是擷取整個App的狀態,我們需要自己定義一個類來繼承這個基類。
(2).定義一些全域的和一些上下文都要用到的變數和方法。
3.優點:
(1).繼承的方式:
生命週期隨著應用程式的銷毀而銷毀。
(2).靜態類或靜態方法:
程式退出後該類或者變數不能立刻被GC回收。
當你再次進入後會發現該靜態類儲存的資訊狀態是之前的。有可能會導致程式不是你想要的初始化狀態。
(3).App的進程被建立時,這個類就會被執行個體化,onCreate()方法就會被執行,給所有全域變數賦初期值。這樣,所有的Activity就共同擁有這個類裡面的變數了。
4.getContext()、getApplication()、getApplicationContext()、getActivity()的區別:
(1).getContext():擷取到當前對象的上下文。
(2).getApplication():獲得Application的對象
(3).getApplicationContext():獲得應用程式的上下文。有且僅有一個相同的對象。生命週期隨著應用程式的摧毀而銷毀。就像是社會,所有的都發生在這個社會上,僅且只有一個社會。每個Activity都有自己的上下文,而整個應用只有一個上下文
(4)getActivity():獲得Fragment依附的Activity對象。Fragment裡邊的getActivity()不推薦使用原因如下:這個方法會返回當前Fragment所附加的Activity,當Fragment生命週期結束並銷毀時,getActivity()返回的是null,所以在使用時要注意判斷null或者捕獲null 指標異常。所以只要判斷getActivity()為空白,就可以不再執行下面的代碼,這完全不影響業務的使用。
5. 應用程式建立Context執行個體的情況有如下幾種情況:
(1).建立Application對象時,而且整個App共一個Application對象
(2).建立Service對象時
(3).建立Activity對象時。
Activity Service Application都是Context的子類。Context是一個抽象類別,具體的實現是在ContextImpl類中。因此應用程式App共有的Context數目公式為:
總Context執行個體個數=Service個數+Activity個數+1(Application對應的Context執行個體)
6.Android應用中記憶體流失問題:
(1).對Context持有一個過長的引用。對Context的引用超過它本身的生命週期。Android應用程式限制使用的堆記憶體是16M
(2).靜態變數擁有了更多的對象引用,記憶體仍然不會被銷毀。
總結一下:避免Context泄漏應該注意的問題:
1.使用Application這種Context類型
2.注意對Context的引用不要超過它本身的生命週期
3.謹慎使用static關鍵字
4.Context裡如果有線程,一定要在onDestory()裡及時停掉。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。