getSystemService

2017-04-13  本文已影响0人  小寒飞刀

getSystemService最终是在SystemServiceRegistry.java里做的:

 public static Object getSystemService(ContextImpl ctx, String name) {
    ServiceFetcher<?> fetcher = SYSTEM_SERVICE_FETCHERS.get(name);
    return fetcher != null ? fetcher.getService(ctx) : null;
}

而SYSTEM_SERVICE_FETCHERS是registerService的时候设的:

 static <T> void registerService(String serviceName, Class<T> serviceClass,
        ServiceFetcher<T> serviceFetcher) {
    SYSTEM_SERVICE_NAMES.put(serviceClass, serviceName);
    SYSTEM_SERVICE_FETCHERS.put(serviceName, serviceFetcher);
}     

registerService是在ContextImplInjector.java里调用的:

 static void registerMiuiServices() {
    SystemServiceRegistry.registerService(Context.SECURITY_SERVICE, SecurityManager.class,
        new CachedServiceFetcher<SecurityManager>() {
            @Override
            public SecurityManager createService(ContextImpl ctx) {
                IBinder b = ServiceManager.getService(Context.SECURITY_SERVICE);
                ISecurityManager service = ISecurityManager.Stub.asInterface(b);
                return new SecurityManager(service);
            }
        }
    );
    SystemServiceRegistry.registerService(Context.LOCATION_POLICY_SERVICE, LocationPolicyManager.class,
        new CachedServiceFetcher<LocationPolicyManager>() {
            @Override
            public LocationPolicyManager createService(ContextImpl ctx) {
                return new LocationPolicyManager(ILocationPolicyManager.Stub.asInterface(
                        ServiceManager.getService(Context.LOCATION_POLICY_SERVICE)));
            }
        }
    );
}     

over, 后面再加binder相关

上一篇 下一篇

猜你喜欢

热点阅读