我们先来看看Android的体系结构图:
可以看到,在Framework层,最核心的功能是一些XXXManager,这些Manager有些是IBinder,有些不是IBinder但间接调用系统服务的IBInder实现功能。总之,这些XXXManager最终的功能是直接或者间接调用系统服务的IPC功能实现的。而系统的所有的服务都通过ServiceManager管理。
我们知道,要调用系统服务的IPC功能,就必须获得系统服务用于IPC的IBInder接口。ServiceManager就是一个提供这样功能的类。我们只需要提供服务所对对应的名字,就可以获得服务所对应的IBInder。下面我们分析一下我们获得系统服务的过程。
我们使用系统服务一般是通过Context里有一个抽象方法getSystemService()实现的,以Activity为例:
@Override
public Object getSystemService(@ServiceName @NonNull String name) {
if (getBaseContext() == null) {
throw new IllegalStateException(
"System services not available to Activities before onCreate()");
}
if (WINDOW_SERVICE.equals(name)) {
return mWindowManager;
} else if (SEARCH_SERVICE.equals(name)) {
ensureSearchManager();
return mSearchManager;
}
return super.getSystemService(name);
}
可以看到最终会调用父类的getSystemService(name),那我们看看Acivity父类 ContextThemeWrapper的getSystemService(name):
@Override public Object getSystemService(String name) {
if (LAYOUT_INFLATER_SERVICE.equals(name)) {
if (mInflater == null) {
mInflater = LayoutInflater.from(getBaseContext()).cloneInContext(this);
}
return mInflater;
}
return getBaseContext().getSystemService(name);
}
这里有调用了BaseContext的 getSystemService(String name),这里的BaseContext其实是一个ContextImpl类,不妨看看:
@Override
public Object getSystemService(String name) {
ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
return fetcher == null ? null : fetcher.getService(this);
}
可以看到,最终是调用了上面这个方法实现的。
可以看到最终是通过 SYSTEM_SERVICE_MAP获取的。
private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
new HashMap<String, ServiceFetcher>();
SYSTEM_SERVICE_MAP是一个静态的HashMap,它是通过静态方法registerService()方法初始化的
private static void registerService(String serviceName, ServiceFetcher fetcher) {
if (!(fetcher instanceof StaticServiceFetcher)) {
fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
}
SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
}
在ContextImpl里有一个静态块:
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 createService(ContextImpl ctx) {
IBinder b = ServiceManager.getService(ALARM_SERVICE);
IAlarmManager service = IAlarmManager.Stub.asInterface(b);
return new AlarmManager(service, ctx);
}});
.........
.........
}
可以看到,上面的方法正式获取各种IBinder,并将通过ServiceFetcher封装,添加到SYSTEM_SERVICE_MAP中。
以上就是获取系统服务的过程。