Android原始碼中的單例模式

2021-08-16 16:33:05 字數 2944 閱讀 1858

前言

在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...