管理一个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;
}
}
后者的优势: 能够更明确地识别出单例对象的创建和使用位置,便于代码的阅读和维护。