前言
在android系統中,我們經常會通過context獲取系統級別的服務,如windowsmanager,activitymanagerservice等,更常用的是乙個layoutinflater的類,這些服務會在合適的時候以單例的形式註冊在系統中,在我們需要的時候就通過context的getsystemservice(string name)獲取。我們以layoutinflater為例來說明,平時我們使用layoutinflater較為常見的地方是在listview的getview方法中:
@override
public view getview(int position,view convertview,viewgroup parent)else
//省略處理**
return itemview;
}
通常我們使用layoutinflater.from(context)來獲取layoutinflater服務,下面來看看layoutinflater.from(context)的實現:
public
static layoutinflater from(context context)
return layoutinflater ;
}
可以看到from(context) 函式內部呼叫的是context類的getsystemservice(string key)方法,我們跟蹤到context類看到,該類是乙個抽象類:
public
abstract
class context
getview中使用的context物件的具體實現類是什麼呢?
public
static
void
main(string args)
asynctask.init();
//**省略
lopper.loop();
}private
void
attach(boolean system)
});iactivitymanager mgr = activitymanagernative.getdefault();
trycatch(remoteexception ex) else {
//省略
}}
在main方法中,我們建立了乙個activitythread物件後,呼叫了其attach函式,並且引數,並且引數為false。在attach函式中,引數為false的情況下(即非系統應用),會通過binder機制與activitymanagerservice通訊,並且最終呼叫handlelaunchactivity函式,我們看看該函式的實現:
private
void
handlelaunchactivity(activityclientrecord r, intent customintent) catch(supernotcallexception e)
throw e;
} return activity;
} private context createbasecontextforactivity(activityclientrecord r,final activity activity)
通過上面 1~5 朱使出的**分析可以知道,context的實現類為 contextimpl。 我們繼續跟蹤contextimpl類:
class contextimpl extends context{
//**省略
//servicefetcher通過getservice獲取服務物件
static class servicefetcher
}else
}/**
*子類覆寫該方法用以建立服務物件
*/public object createservice(contextimpl ctx)
}// 1. service容器
private
static
final hashmapsystem_service_map = new hashmap();
private
static
int snextpercontextservicecacheindex = 0;
//2. 註冊伺服器
private
static
void
registerservice(string servicename, servicefetcher fetcher)
//3. 靜態語句塊,第一次載入該類時執行(只執行一次保證例項的唯一性)
static
//4. 根據key獲取相應的服務
@override
public object getsystemservice(string name)
//**省略
}
從contextimpl類的部分**中可以看到,在虛擬機器第一次載入該類時會註冊各種servicefatcher,其中就包含了layoutinflater service。將這些服務以鍵值對的形式儲存在乙個hashmap中,使用者使用時只需要根據key來獲取到相應的servicefetcher,然後通過servicefetcher物件的getservice函式來獲取具體的服務物件。當第一次獲取時,會呼叫servicefetcher的createservice函式建立服務物件。然後將物件快取到乙個列表裡,下次再取時直接從快取中獲取,避免重複建立物件,從而達到單例的效果。
Android原始碼中的設計模式1 單例模
1 單例模式 實現方式簡單,應用也最為廣泛的一種設計模式。解決的問題 保證乙個類在記憶體中的物件唯一性。比如 多程式讀取乙個配置檔案時,建議配置檔案封裝成物件。會方便操作其中資料,又要保證多個程式讀到的是同乙個配置檔案物件,就需要該配置檔案物件在記憶體中是唯一的。像資料庫操作等,jdbc。那麼,如何...
android原始碼裡的單例模式和模版模式
一般單例都是乙個類寫乙個的,這裡單例和模版模式結合起來了 抽象類public abstract class singleton return minstance 具體使用 private static final singletongdefault new singleton iactivityma...
設計模式及在Android中的應用 單例模式
確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。這樣做有以下幾個優點 對於那些比較耗記憶體的類,只例項化一次可以大大提高效能,尤其是在移動開發中 保持程式執行的時候該中始終只有乙個例項存在記憶體中 有如下經典的實現方式 public class singleton public s...