美文网首页
Android之Framework层系统服务框架实现

Android之Framework层系统服务框架实现

作者: 锄禾豆 | 来源:发表于2022-02-07 09:30 被阅读0次

    关键类

    com.android.server.LocalServices
    com.android.server.SystemServiceManager
    com.android.server.SystemService
    

    LocalServices

    public final class LocalServices {
        private LocalServices() {}
    
        private static final ArrayMap<Class<?>, Object> sLocalServiceObjects =
                new ArrayMap<Class<?>, Object>();//Key:Class<?> 万类皆成Class,Value:Object,万类皆Object
    
        /**
         * Returns a local service instance that implements the specified interface.
         *
         * @param type The type of service.
         * @return The service object.
         */
        @SuppressWarnings("unchecked")
        public static <T> T getService(Class<T> type) {
            synchronized (sLocalServiceObjects) {
                return (T) sLocalServiceObjects.get(type);
            }
        }
    
        /**
         * Adds a service instance of the specified interface to the global registry of local services.
         */
        public static <T> void addService(Class<T> type, T service) {
            synchronized (sLocalServiceObjects) {
                if (sLocalServiceObjects.containsKey(type)) {
                    throw new IllegalStateException("Overriding service registration");
                }
                sLocalServiceObjects.put(type, service);
            }
        }
    
        /**
         * Remove a service instance, must be only used in tests.
         */
        @VisibleForTesting
        public static <T> void removeServiceForTest(Class<T> type) {
            synchronized (sLocalServiceObjects) {
                sLocalServiceObjects.remove(type);
            }
        }
    }
    
    关键点:
    1.ArrayMap<Class<?>, Object> sLocalServiceObjects =
                new ArrayMap<Class<?>, Object>();
    万类皆有Class,万类皆Object
    
    2.普通get add remove集成
    
    3.目的:
    进程内的服务,怎么更有效的通信呢?
    常规来说,我们把被需要者传给需要者,需要者再在内部使用
    而这样直接减少了内部的耦合,只需要直接从LocalServices即可
    

    SystemServiceManager和SystemService

    前言:
    我们创建的系统服务,一般都继承SystemService,再通过SystemServiceManager的startService启动它。
    
    详情
    SystemService 
    1.public abstract class SystemService 它是一个抽象类
    
    
    SystemServiceManager
    1.它负责管理SystemService,更具体说,它负责启动系统服务的各种生命周期
    /**
     * Manages creating, starting, and other lifecycle events of
     * {@link com.android.server.SystemService system services}.
     *
     * {@hide}
     */
     
    2.具体实现
        1)startService的神操作
         public <T extends SystemService> T startService(Class<T> serviceClass) {
            try {
                final String name = serviceClass.getName();
                Slog.i(TAG, "Starting " + name);
                Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartService " + name);
    
                // Create the service.
                if (!SystemService.class.isAssignableFrom(serviceClass)) {
                    throw new RuntimeException("Failed to create " + name
                            + ": service must extend " + SystemService.class.getName());
                }
                final T service;
                try {
                    Constructor<T> constructor = serviceClass.getConstructor(Context.class);
                    service = constructor.newInstance(mContext);//通过反射生成对象
                } catch (InstantiationException ex) {
                    throw new RuntimeException("Failed to create service " + name
                            + ": service could not be instantiated", ex);
                } catch (IllegalAccessException ex) {
                    throw new RuntimeException("Failed to create service " + name
                            + ": service must have a public constructor with a Context argument", ex);
                } catch (NoSuchMethodException ex) {
                    throw new RuntimeException("Failed to create service " + name
                            + ": service must have a public constructor with a Context argument", ex);
                } catch (InvocationTargetException ex) {
                    throw new RuntimeException("Failed to create service " + name
                            + ": service constructor threw an exception", ex);
                }
    
                // Register it.
                mServices.add(service);//将service导入列表中。这种神操作,直接给后面系统服务的生命周期调用埋下有利的元素
    
                // Start it.
                try {
                    service.onStart();//启动服务的onStart方法
                } catch (RuntimeException ex) {
                    throw new RuntimeException("Failed to start service " + name
                            + ": onStart threw an exception", ex);
                }
                return service;//返回对象
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
            }
        }
        
        2)其他生命周期的神操作案例
        public void startBootPhase(final int phase) {
            if (phase <= mCurrentPhase) {
                throw new IllegalArgumentException("Next phase must be larger than previous");
            }
            mCurrentPhase = phase;
    
            Slog.i(TAG, "Starting phase " + mCurrentPhase);
            try {
                Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "OnBootPhase " + phase);
                final int serviceLen = mServices.size();//神操作的开始
                for (int i = 0; i < serviceLen; i++) {
                    final SystemService service = mServices.get(i);
                    try {
                        service.onBootPhase(mCurrentPhase);//各种生命周期的调用
                    } catch (Exception ex) {
                        throw new RuntimeException("Failed to boot service "
                                + service.getClass().getName()
                                + ": onBootPhase threw an exception during phase "
                                + mCurrentPhase, ex);
                    }
                }
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
            }
        }
    

    总结

    采用泛函,让对象高度抽象化,从而使代码更加简单明了。
    这就是高手段位
    

    相关文章

      网友评论

          本文标题:Android之Framework层系统服务框架实现

          本文链接:https://www.haomeiwen.com/subject/gygqkrtx.html