Service的管理方式:单例 or 静态

72 阅读1分钟

管理一个Service中的注册和解注册,可以通过如下方式:

object TestService {

    var mListeners: CopyOnWriteArrayList<ITestListener>? = null

    fun register(iTestListener: ITestListener) {
        mListeners?.add(iTestListener)
    }

    fun unregister(iTestListener: ITestListener) {
        mListeners?.remove(iTestListener)
    }

}

但是,在使用过程中发现,较多的调用地方,会导致无法确定该类的生命周期开始的地方和结束的地方(因为每个地方使用都是一样的

TestService.register(it)

因此,可以考虑使用一个统一的管理类来维护这些Service的生命周期,管理类如下:

public class TestServiceManager {

    private static final String TAG = "TestServiceManager";

    private static final ConcurrentHashMap<Class, Object> SERVICES = new ConcurrentHashMap<>();

    /**
     * 手动为接口注册实现类
     *
     * @param clazz 接口的class
     * @param obj   实现了该接口的实例
     */
    public static <T> void registerService(Class<T> clazz, T obj) {
        if (!SERVICES.containsKey(clazz)) {
            SERVICES.put(clazz, obj);
        }
    }

    /***
     *  获取指定接口的实现类
     *
     * @param clazz 指定接口的class
     * @return 实现了该接口的一个实例,如果找不到会返回null
     */
    public static <T> T getService(Class<T> clazz) {
        T impl = (T) SERVICES.get(clazz);
        return impl;
    }

}

后者的优势: 能够更明确地识别出单例对象的创建和使用位置,便于代码的阅读和维护。