博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 各种Manager实例的创建
阅读量:5079 次
发布时间:2019-06-12

本文共 1914 字,大约阅读时间需要 6 分钟。

具体实现类 base/core/java/android/app/ContextImpl.java

里面含有静态代码块,registerService(SENSOR_SERVICE, new ServiceFetcher() {

                  public Object createService(ContextImpl ctx) {
                      return new SystemSensorManager(ctx.mMainThread.getHandler().getLooper());
                  }});

各种实例都在其中,主要是通过Map来集中管理,

        private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =

 268             new HashMap<String, ServiceFetcher>();
 269
 270     private static int sNextPerContextServiceCacheIndex = 0;
 271     private static void registerService(String serviceName, ServiceFetcher fetcher) {
 272         if (!(fetcher instanceof StaticServiceFetcher)) {
 273             fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
 274         }
 275         SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
 276     }
   @Override
1478     public Object getSystemService(String name) {
1479         ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
1480         return fetcher == null ? null : fetcher.getService(this);
1481     }

              fetch.getService会调用createService,然后直接返回 代码如下

 public Object getService(ContextImpl ctx) {

 215             ArrayList<Object> cache = ctx.mServiceCache;
 216             Object service;
 217             synchronized (cache) {
 218                 if (cache.size() == 0) {
 219                     // Initialize the cache vector on first access.
 220                     // At this point sNextPerContextServiceCacheIndex
 221                     // is the number of potential services that are
 222                     // cached per-Context.
 223                     for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) {
 224                         cache.add(null);
 225                     }
 226                 } else {
 227                     service = cache.get(mContextCacheIndex);
 228                     if (service != null) {
 229                         return service;
 230                     }
 231                 }
 232                 service = createService(ctx);
 233                 cache.set(mContextCacheIndex, service);
 234                 return service;
 235             }
 236         }

 

          获取的时候直接在SYSTEM_SERVICE_MAP取出来,

    @Override

1478     public Object getSystemService(String name) {
1479         ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
1480         return fetcher == null ? null : fetcher.getService(this);
1481     }

转载于:https://www.cnblogs.com/minzi/archive/2013/04/08/3008620.html

你可能感兴趣的文章
蓝桥杯-分小组-java
查看>>
Android Toast
查看>>
JAVA面试常见问题之Redis篇
查看>>
jdk1.8 api 下载
查看>>
getElement的几中属性介绍
查看>>
HTML列表,表格与媒体元素
查看>>
设计器 和后台代码的转换 快捷键
查看>>
STL容器之vector
查看>>
数据中心虚拟化技术
查看>>
复习文件操作
查看>>
SQL Server 使用作业设置定时任务之一(转载)
查看>>
第二阶段冲刺-01
查看>>
BZOJ1045 HAOI2008 糖果传递
查看>>
JavaScript 克隆数组
查看>>
eggs
查看>>
oracle 报错ORA-12514: TNS:listener does not currently know of service requested in connec
查看>>
python3 生成器与迭代器
查看>>
java编写提升性能的代码
查看>>
Abstract Factory Pattern
查看>>
list 容器 排序函数.xml
查看>>