前言

记录一下getSystemService()获取的源码流程,加深一下印象。

正文

这里以获取AudioManager为例

  1. AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
复制

getSystemService()定义在Context.java中

  1. public static final String AUDIO_SERVICE = "audio";
复制

Context.java

  1. frameworks\base\core\java\android\content\Context.java
复制
  1. public abstract @Nullable Object getSystemService(@ServiceName @NonNull String name);
复制

抽象方法。

Context的实现类是ContextImpl,具体看ContextImpl.java

ContextImpl.java

  1. \frameworks\base\core\java\android\app\ContextImpl.java
复制
  1. @Override
  2. public Object getSystemService(String name) {
  3.   if (vmIncorrectContextUseEnabled()) {
  4.   //略
  5.   }
  6.   //重点关注后面的
  7.   return SystemServiceRegistry.getSystemService(this, name);
  8. }
复制

SystemServiceRegistry.java

  1. \frameworks\base\core\java\android\app\SystemServiceRegistry.java
复制

我们一开始传入的name是Context.AUDIO_SERVICE,也就是audio。

  1. public static Object getSystemService(ContextImpl ctx, String name) {
  2. //不为null
  3.   if (name == null) {
  4.       return null;
  5.   }
  6.   //SYSTEM_SERVICE_FETCHERS是map,存储了服务相关信息
  7.   final ServiceFetcher<?> fetcher = SYSTEM_SERVICE_FETCHERS.get(name);
  8.   if (fetcher == null) {
  9.       if (sEnableServiceNotFoundWtf) {
  10.           Slog.wtf(TAG, "Unknown manager requested: " + name);
  11.       }
  12.       return null;
  13.   }
  14. //获取服务,这里需要重点关注fetcher
  15.   final Object ret = fetcher.getService(ctx);
  16.   if (sEnableServiceNotFoundWtf && ret == null) {
  17.       // Some services do return null in certain situations, so don't do WTF for them.
  18.       switch (name) {
  19.           case Context.CONTENT_CAPTURE_MANAGER_SERVICE:
  20.           case Context.APP_PREDICTION_SERVICE:
  21.           case Context.INCREMENTAL_SERVICE:
  22.           case Context.ETHERNET_SERVICE:
  23.               return null;
  24.       }
  25.       return null;
  26.   }
  27.   return ret;
  28. }
复制

上面重点关注的是SYSTEM_SERVICE_FETCHERS和ServiceFetcher。

SYSTEM_SERVICE_FETCHERS
  1. private static final Map<String, ServiceFetcher<?>> SYSTEM_SERVICE_FETCHERS =
  2. new ArrayMap<String, ServiceFetcher<?>>();
复制

具体看哪里添加的

registerService
  1. //私有的静态变量,类内部使用
  2. private static <T> void registerService(@NonNull String serviceName,
  3. @NonNull Class<T> serviceClass, @NonNull ServiceFetcher<T> serviceFetcher) {
  4. SYSTEM_SERVICE_NAMES.put(serviceClass, serviceName);
  5. //这里添加的
  6. SYSTEM_SERVICE_FETCHERS.put(serviceName, serviceFetcher);
  7. SYSTEM_SERVICE_CLASS_NAMES.put(serviceName, serviceClass.getSimpleName());
  8. }
复制

这里有多个map存储服务相关信息,我们这里值关注SYSTEM_SERVICE_FETCHERS。

第一个是服务名,第二个是serviceFetcher。

在SystemServiceRegistry中有一个静态代码块,这里注册了

  1. Context.ACTIVITY_SERVICE
  2. Context.AUDIO_SERVICE
  3. Context.ACCOUNT_SERVICE
  4. Context.ACCESSIBILITY_SERVICE
  5. Context.HDMI_CONTROL_SERVICE
复制

这里只关注AUDIO_SERVICE的注册。

  1. static{
  2. //略
  3. registerService(Context.AUDIO_SERVICE, AudioManager.class,
  4. new CachedServiceFetcher<AudioManager>() {
  5. @Override
  6. public AudioManager createService(ContextImpl ctx) {
  7. return new AudioManager(ctx);
  8. }});
  9. //略
  10. }
复制

第三个是匿名创建CachedServiceFetcher

CachedServiceFetcher
  1. static abstract class CachedServiceFetcher<T> implements ServiceFetcher<T> {
  2. private final int mCacheIndex;
  3.  
  4. CachedServiceFetcher() {
  5. mCacheIndex = sServiceCacheSize++;
  6. }
  7.  
  8. @Override
  9. @SuppressWarnings("unchecked")
  10. public final T getService(ContextImpl ctx) {
  11. final Object[] cache = ctx.mServiceCache;
  12. final int[] gates = ctx.mServiceInitializationStateArray;
  13. boolean interrupted = false;
  14. T ret = null;
  15. //循环,知道获取成功就退出
  16. for (;;) {
  17. boolean doInitialize = false;
  18. synchronized (cache) {
  19. //如果存在缓存,就返回
  20. T service = (T) cache[mCacheIndex];
  21. if (service != null) {
  22. ret = service;
  23. break; // exit the for (;;)
  24. }
  25. if (gates[mCacheIndex] == ContextImpl.STATE_READY
  26. || gates[mCacheIndex] == ContextImpl.STATE_NOT_FOUND) {
  27. gates[mCacheIndex] = ContextImpl.STATE_UNINITIALIZED;
  28. }
  29. if (gates[mCacheIndex] == ContextImpl.STATE_UNINITIALIZED) {
  30. doInitialize = true;
  31. gates[mCacheIndex] = ContextImpl.STATE_INITIALIZING;
  32. }
  33. }
  34. if (doInitialize) {
  35. T service = null;
  36. @ServiceInitializationState int newState = ContextImpl.STATE_NOT_FOUND;
  37. try {
  38. service = createService(ctx);
  39. newState = ContextImpl.STATE_READY;
  40.  
  41. } catch (ServiceNotFoundException e) {
  42. onServiceNotFound(e);
  43.  
  44. } finally {
  45. synchronized (cache) {
  46. cache[mCacheIndex] = service;
  47. gates[mCacheIndex] = newState;
  48. cache.notifyAll();
  49. }
  50. }
  51. ret = service;
  52. break;
  53. }
  54. synchronized (cache) {
  55. while (gates[mCacheIndex] < ContextImpl.STATE_READY) {
  56. try {
  57. interrupted |= Thread.interrupted();
  58. cache.wait();
  59. } catch (InterruptedException e) {
  60. interrupted = true;
  61. }
  62. }
  63. }
  64. }
  65. if (interrupted) {
  66. Thread.currentThread().interrupt();
  67. }
  68. return ret;
  69. }
  70.  
  71. public abstract T createService(ContextImpl ctx) throws ServiceNotFoundException;
  72. }
复制

上面代码很多,但最重要的是需要重写的createService()。

因此回到上面第三个参数创建匿名CachedServiceFetcher对象代码处。

  1. new CachedServiceFetcher<AudioManager>() {
  2. @Override
  3. public AudioManager createService(ContextImpl ctx) {
  4. return new AudioManager(ctx);
  5. }}
复制

这里是直接返回了新创建的AudioManager对象。

至此,上面

  1. AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
复制

就类似等价于

  1. AudioManager audioManager = new AudioManager(ctx);
复制

参考文章

相关文章

暂无评论

none
暂无评论...