Android 系统服务的获取与创建
2018-11-22 16:00
1506 查看
在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就好了。
相关文章推荐
- Android获取系统隐藏服务实现锁屏
- Android用loadClass获取系统隐藏类和隐藏服务的方法
- Android获取系统隐藏服务实现锁屏
- Android源码剖析之----系统服务的获取
- Android获取系统服务
- 获取android系统服务信息dumpsys,监视android系统systrace
- Android获取系统隐藏服务实现锁屏
- Android获取系统隐藏服务实现锁屏
- Android 关于系统Context.getSystemService(String arg0)获取系统服务的详细剖析-getSystemService
- 创建一个开机自启动的Android系统服务
- Android 获取系统服务的源代码分析
- Android开发之--利用系统自带的服务获取经纬度并转为具体位置
- [置顶] Android源码分析之SystemServer系统服务创建过程
- Android获取系统隐藏服务实现锁屏
- Android getSystemService获取系统相应的服务
- Android获取系统隐藏服务实现锁屏
- 获取android系统服务
- Android编程获取系统隐藏服务实现锁屏的方法
- Android客户端之“微服私访”App的系统学习(三)基于 OkHttp和Gson 快速获取解析服务数据
- Android获取系统服务getSystemService与getService区别