Android 系統服務的獲取與建立
阿新 • • 發佈:2018-12-27
在Android系統中,有一群很厲害的“傢伙”,如果把Android系統比喻成一個大幫派,那麼這群“傢伙”的地位就像那各個分堂的堂主一樣,所有的應用就像是各個小馬哥,他們要做什麼事情,都要堂主審批,審批過了才能提交總部處理。
接下來我會牽扯出幾個常用的堂主,並且簡單介紹下他們的建立過程和對應的功能
ActivityManager是Android系統服務ActivityManagerService提供出來供應用呼叫的API,負責四大元件的支援
WindowManager是Android系統服務WindowManagerService提供出來供應用呼叫的的API,負責視窗管理
PackageManager是Android系統服務PackageManagerService提供出來供應用呼叫的的API,負責應用的包管理
這裡,ActivityManager就是堂主的角色,而ActivityManagerService就是總部的角色
建立Manager
那麼我們看一下這些Manager的建立過程在Android的系統中存在這麼一個類SystemServiceRegistry,這個類就是負責註冊並存儲,讓我帶大家瞭解一下服務的註冊過程吧~
static { registerService(Context.ACTIVITY_SERVICE, ActivityManager.class, new CachedServiceFetcher<ActivityManager>() { @Override在靜態程式碼塊中,呼叫了靜態方法registerService方法,傳入Context下的key值和一個CachedServiceFetcher物件,我們看一下registerService函式public ActivityManager createService(ContextImpl ctx) { return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); }}); }
private static <T> void registerService(String serviceName, Class<T> serviceClass, ServiceFetcher我們可以看到是把傳進來的引數僅僅就是存入了Map集合中,這些Manager的真正建立其實是在呼叫context.getSystemService的時候。接下來我們來看一下獲取Manager 獲取Manager<T> serviceFetcher) { SYSTEM_SERVICE_NAMES.put(serviceClass, serviceName); SYSTEM_SERVICE_FETCHERS.put(serviceName, serviceFetcher); }
當我們需要獲取Manager服務的時候,我們通常會這樣寫
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
那麼我們就從這個開始跟起,看一下Context下的getSystemService函式,Context的實現類為ContextImpl,所以我們直接看ContextImpl的getSystemService就好了
@Override public Object getSystemService(String name) { return SystemServiceRegistry.getSystemService(this, name); }我們可以看到,是呼叫了SystemServiceRegistry的getSystemService方法
public static Object getSystemService(ContextImpl ctx, String name) { ServiceFetcher<?> fetcher = SYSTEM_SERVICE_FETCHERS.get(name); return fetcher != null ? fetcher.getService(ctx) : null; }
這裡通過傳入的key值,從Map集合中在取出CachedServiceFetcher物件,並呼叫getService方法,我們看一下getService
@Override @SuppressWarnings("unchecked") public final T getService(ContextImpl ctx) { final Object[] cache = ctx.mServiceCache; synchronized (cache) { // Fetch or create the service. Object service = cache[mCacheIndex]; if (service == null) { try { service = createService(ctx); cache[mCacheIndex] = service; } catch (ServiceNotFoundException e) { onServiceNotFound(e); } } return (T)service; } }這裡是先獲取了Manager的快取陣列mServiceCache,然後先從陣列中獲取,如果為空在建立,負責直接返回陣列內歷史建立的例項出來 這塊的createService就是先前CachedServiceFetcher物件下的createService函式,就是registerService傳入的CachedServiceFetcher物件下的createService函式 這些Manager其實在系統開機的時候,就做好了註冊工作,就等呼叫的時候createService就好了。