getSystemService

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相关

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容