第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Android 系統(tǒng)服務(wù)的獲取與創(chuàng)建

標(biāo)簽:
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就好了

@Overridepublic 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就好了。

原文出处:https://www.cnblogs.com/kezhuang/p/10001602.html  

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫(xiě)下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消