我们经常会使用context来获取服务实例,完成某些特定的功能。
辣么他的大致是什么样的流程呢?下面跟踪一下source code。 代码基于Android 5.1.1
一、相关的类文件:
framework/base/core/java/android/app/ContextImpl.java
二、相关流程
this.getSystemService(Context.LAYOUT_INFLATER_SERVICE) ;
@Override
public Object getSystemService(String name) {
ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
return fetcher == null ? null : fetcher.getService(this);
}
从上面getSystemService方法中看到,首先是从SYSTEM_SERVICE_MAP中获取ServiceFetcher对象,然后调用ServiceFetcher对象的getService方法获取管理的service.
这里的SYSTEM_SERVICE_MAP 是一个HashMap,键值对的方式存储service相关信息。
private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
new HashMap<String, ServiceFetcher>();
SYSTEM_SERVICE_MAP 是static 因此在加载ContextImpl.java这个类的时候,就初始化了。
下面用的是一个静态初始化块将service添加到对应的
SYSTEM_SERVICE_MAP 中:
static {
registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() {
public Object getService(ContextImpl ctx) {
return AccessibilityManager.getInstance(ctx);
}});
registerService(CAPTIONING_SERVICE, new ServiceFetcher() {
public Object getService(ContextImpl ctx) {
return new CaptioningManager(ctx);
}});
registerService(ACCOUNT_SERVICE, new ServiceFetcher() {
public Object createService(ContextImpl ctx) {
IBinder b = ServiceManager.getService(ACCOUNT_SERVICE);
IAccountManager service = IAccountManager.Stub.asInterface(b);
return new AccountManager(ctx, service);
}});
registerService(ACTIVITY_SERVICE, new ServiceFetcher() {
public Object createService(ContextImpl ctx) {
return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());
}});
registerService(ALARM_SERVICE, new ServiceFetcher() {
public Object