赞
踩
Fast Glance
context.getSystemService 方法用于获取缓存在 ContextImpl 中的系统服务 Manager。缓存的设计,确保每个 ContextImpl 中每种系统服务只有一个 Manager 实例,仅仅在第一次获取时通过 CachedServiceFetcher 创建。
使用示例:
// Activity#attach()
mWindow.setWindowManager(
(WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
...);
解析:
// Context
public Object getSystemService(String name) {
return mBase.getSystemService(name);
}
// ContextImpl
public Object getSystemService(String name) {
// SYSTEM_SERVICE_FETCHERS -> ServiceFetcher -> Manager
return SystemServiceRegistry.getSystemService(this, name);
}
SystemServiceRegistry 管理所有可以由 Context#getSystemService 获得的系统服务的 Manager,比如:
WINDOW_SERVICE = "window" // WindowManager.class,实现为 WindowManagerImpl
ACTIVITY_SERVICE = "activity" // ActivityManager.class
SystemServiceRegistry 的重要字段:
字段名 | 类型 | 说明 |
---|---|---|
SYSTEM_SERVICE_NAMES | Map<Class<?>, String> | |
SYSTEM_SERVICE_FETCHERS | Map<String, ServiceFetcher<?>> |
对于这些常用的系统服务,在 SystemServiceRegistry 的静态代码块中注册了它们的 Manager 的获得方式 ServiceFetcher。
// SystemServiceRegistry.java
static {
...
registerService(Context.DISPLAY, DisplayManager.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。