1. 程式人生 > >Android 系統服務的獲取與建立

Android 系統服務的獲取與建立

在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
        
public ActivityManager createService(ContextImpl ctx) { return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); }}); }
在靜態程式碼塊中,呼叫了靜態方法registerService方法,傳入Context下的key值和一個CachedServiceFetcher物件,我們看一下registerService函式  
private static <T> void registerService(String serviceName, Class<T> serviceClass,
        ServiceFetcher
<T> serviceFetcher) { SYSTEM_SERVICE_NAMES.put(serviceClass, serviceName); SYSTEM_SERVICE_FETCHERS.put(serviceName, serviceFetcher); }
我們可以看到是把傳進來的引數僅僅就是存入了Map集合中,這些Manager的真正建立其實是在呼叫context.getSystemService的時候。接下來我們來看一下獲取Manager 獲取Manager

當我們需要獲取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就好了。