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 =
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信