您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關Android中怎么實現單例模式,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
1.意圖
保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
熱門詞匯:單例 *** 私有構造
2.結構
android中有很多系統級別的全局變量,如時間,輸入法,賬戶,狀態欄等等,android中對這些都直接或者有些間接用到了單例模式。
以輸入法為例,把上圖修改為實際情況:
非常的簡單,但是有一點,從上面我們也看到了synchronized關鍵字,在多線程的環境下,單例模式為了保證自己實例數量的***,必然會做并發控制。
類似這種線程安全的單例,跨進程的單例,參數化的單例等等的情況,確實超出本文的范圍,而且都涉及到很多東西,是一個很大的話題,不好展開。
3. 代碼:
public final class InputMethodManager { static final Object mInstanceSync = new Object();//同步 //內部全局***實例 static InputMethodManager mInstance; //對外api static public InputMethodManager getInstance(Context context) { return getInstance(context.getMainLooper()); } /** * 內部api,供上面的外部api調用 * @hide 系統隱藏的api */ static public InputMethodManager getInstance(Looper mainLooper) { synchronized (mInstanceSync) { if (mInstance != null) { return mInstance; } IBinder b = ServiceManager.getService(Context.INPUT_METHOD_SERVICE); IInputMethodManager service = IInputMethodManager.Stub.asInterface(b); mInstance = new InputMethodManager(service, mainLooper); } return mInstance; } }
客戶端調用,比如contextimpl中的getSystemService()方法中如下調用:
class ContextImpl extends Context{ @Override public Object getSystemService(String name) { if (WINDOW_SERVICE.equals(name)) { //... ... 省略下面n個if,else if } else if (INPUT_METHOD_SERVICE.equals(name)) { //獲取輸入法管理者***實例 return InputMethodManager.getInstance(this); } else if (KEYGUARD_SERVICE.equals(name)) { //... ... 省略下面n個if,else if } else if (ACCESSIBILITY_SERVICE.equals(name)) { //又見單例,無處不在 return AccessibilityManager.getInstance(this); } else if (LOCATION_SERVICE.equals(name)) { //... ... 省略下面n個if,else if } else if (NFC_SERVICE.equals(name)) { return getNfcManager(); } return null; } }
上述就是小編為大家分享的Android中怎么實現單例模式了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。