android搭建系统服务,Android 系统服务的获取与创建

在Android系统中,有一群很厉害的“家伙”,如果把Android系统比喻成一个大帮派,那么这群“家伙”的地位就像那各个分堂的堂主一样,所有的应用就像是各个小马哥,他们要做什么事情,都要堂主审批,审批过了才能提交总部处理。

接下来我会牵扯出几个常用的堂主,并且简单介绍下他们的创建过程和对应的功能

ActivityManager是Android系统服务ActivityManagerService提供出来供应用调用的API,负责四大组件的支持

WindowManager是Android系统服务WindowManagerService提供出来供应用调用的的API,负责窗口管理

PackageManager是Android系统服务PackageManagerService提供出来供应用调用的的API,负责应用的包管理

这里,ActivityManager就是堂主的角色,而ActivityManagerService就是总部的角色

创建Manager

那么我们看一下这些Manager的创建过程

在Android的系统中存在这么一个类SystemServiceRegistry,这个类就是负责注册并存储,让我带大家了解一下服务的注册过程吧~

AAffA0nNPuCLAAAAAElFTkSuQmCCstatic {

registerService(Context.ACTIVITY_SERVICE, ActivityManager.class,            new CachedServiceFetcher() {

@Override        public ActivityManager createService(ContextImpl ctx) {            return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());

}});

}

AAffA0nNPuCLAAAAAElFTkSuQmCC

在静态代码块中,调用了静态方法registerService方法,传入Context下的key值和一个CachedServiceFetcher对象,我们看一下registerService函数

private static  void registerService(String serviceName, Class serviceClass,

ServiceFetcher 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

AAffA0nNPuCLAAAAAElFTkSuQmCC@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;

}

}

AAffA0nNPuCLAAAAAElFTkSuQmCC

这里是先获取了Manager的缓存数组mServiceCache,然后先从数组中获取,如果为空在创建,负责直接返回数组内历史创建的实例出来

这块的createService就是先前CachedServiceFetcher对象下的createService函数,就是registerService传入的CachedServiceFetcher对象下的createService函数

这些Manager其实在系统开机的时候,就做好了注册工作,就等调用的时候createService就好了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值