Application作爲貫穿整個應用的必不可少的一個類,必須要知道它能做什麼,有什麼缺點。所以,這篇文章主要從Application 源碼方面解讀
一.Application和Dalvik的關係
一般情況下app只會有一個虛擬機,一個虛擬機只會有一個application,也就是說一個Application只會存在一個Dalvik
還有一個app多進程,就意味着app擁有多個Application,多個Dalvik,Application相互獨立,在不同的進程裏面,數據不能相互訪問
二.Application 與Context的關係
說Application就是是一個Context也是正確的, application 的父類是 ContextWrapper, ContextWrapper 的父類是 Context,所以說Application就是context是正確的
三.Application能做什麼?
1.因爲本質是context,所以context能做得,它都能做,eg: 獲取顏色 context.getResrouce
、context.getColor
等常見的資源獲取操作
2.可以獲取一個Looper對象,都知道Looper是和Handler有關聯的,獲取一個Looper對象,可直接通過上下文對象getMainLooper()獲取,也就是說,在應用啓動的時候,app就一直存在一個Looper對象
在Application父類ContextWrapper裏面存在下面這樣一個方法:
3.可以監聽所有Activity的生命週期
在Application裏面,我們能看到如下接口方法
是不是和我們的Activity週期一致呢,所以如果想要監聽Acitivty生命週期,我們可以寫一個MyApplication去繼承Application,
如下圖
4.可以獲取內存使用情況
Application實現了一個接口ComponentCallbacks2,在ComponentCallbacks2裏面封裝了內存Level閾值定義和監聽方法,如下
@IntDef(prefix = { "TRIM_MEMORY_" }, value = {
TRIM_MEMORY_COMPLETE,
TRIM_MEMORY_MODERATE,
TRIM_MEMORY_BACKGROUND,
TRIM_MEMORY_UI_HIDDEN,
TRIM_MEMORY_RUNNING_CRITICAL,
TRIM_MEMORY_RUNNING_LOW,
TRIM_MEMORY_RUNNING_MODERATE,
})
@Retention(RetentionPolicy.SOURCE)
public @interface TrimMemoryLevel {}
static final int TRIM_MEMORY_COMPLETE = 80;
static final int TRIM_MEMORY_MODERATE = 60;
static final int TRIM_MEMORY_BACKGROUND = 40;
static final int TRIM_MEMORY_UI_HIDDEN = 20;
static final int TRIM_MEMORY_RUNNING_CRITICAL = 15;
static final int TRIM_MEMORY_RUNNING_LOW = 10;
static final int TRIM_MEMORY_RUNNING_MODERATE = 5;
void onTrimMemory(@TrimMemoryLevel int level);
在ComponentCallbacks2的父類ComponentCallbacks裏面同樣有一個低內存監控方法onLowMemory();
當App內存不足的時候,我們可以在Application的TrimMemoryLevel()和onLowMemory()方法中去保存一些我們需要保存的數據、回收一些資源釋放內存等
注意:在保存數據的時候,可能Application已經被系統回收了,此時,我們需要做一個非空判斷
5.上下文對象
application的生命週期是伴隨這個app的,所以,如果有生命週期比較長、且又要引用上下文對象的,最好通過application獲取,這樣就不會發生內存泄漏等問題
application介紹完了,謝謝!