单例模式(二)

单例模式在Android源码中的应用

除了之前说的几种单例的实现方式之外还可以使用容器来实现。

public class SingletonManager {
    private static final Map<String, Object> instanceMap = new HashMap<String, Object>();

    public static void register(String key, Object obj) {
        instanceMap.put(key, obj);
    }

    public static Object get(String key) {
        return instanceMap.get(key);
    }
}

在Android的系统服务创建时在使用了这个方法以保证任务的单例,并提供给我们使用。以LayoutInflater为例。

LayoutInflater.class

可以看到context.getSystemService方法是Context提供给我们获取服务的方法。

ContextImpl.class

Context的实现类ContextImpl中可以找的方法的实现。

SystemServiceRegistry.class

SystemServiceRegisty类中可以发现SYSTEM_SERVICE_FETCHERS(静态的HashMap<String, ServiceFetcher<?>>)可以获取到一个ServiceFetcher<?>对象,在通过这个对象的getService方法获取到相应的服务。

SystemServiceRegisty类是被final修饰的类无法被继承,并且私有了构造方法。其中有一个静态方法是用于注册服务的也就是把ServiceFetcher<?>放入HashMap中去。

registerService方法

由于这个方法是私有的,就导致注册的操作必须在这个类中完成。所以所有服务的创建都在这个类的静态代码块中完成。

创建和注册服务

以上就是Android中实现服务单例的过程。

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,466评论 25 708
  • 单例模式(SingletonPattern)一般被认为是最简单、最易理解的设计模式,也因为它的简洁易懂,是项目中最...
    成热了阅读 4,298评论 4 34
  • 单例是一种类,该类只能在第一次用的时候实例化一个对象,后期直接调用此对象(有点共享的意思)。 在Foundatio...
    milk_powder阅读 320评论 0 0
  • 情人节去看了《极限特工》。 作为资深屌丝,我是第一次去电影院,为啥?电影票太贵,买不起呀。 就连我爱豆的电影都是充...
    百里飘絮阅读 2,085评论 0 6
  • 我认为,生活方式和寿命没有太大的关系。就像有的人,眼睛,总是不会近视,而有的人很容易就,戴上了眼镜。这是基因在起作...
    lygly9阅读 98评论 0 0