Android系统源码中的单例模式:
代码路径:/frameworks/base/core/java/android/util/Singleton.java

package android.util;/** * Singleton helper class for lazily initialization. * * Modeled after frameworks/base/include/utils/Singleton.h * * @hide */public abstract class Singleton<T> {    private T mInstance;    protected abstract T create();    public final T get() {        synchronized (this) {            if (mInstance == null) {                mInstance = create();            }            return mInstance;        }    }}

调用位置之一是Activity工作流程中ActivityManagerNative.getDefault().startActivity,这里的ActivityManagerNative.getDefault返回ActivityManagerService的远程接口,即ActivityManagerProxy接口,具体不做讨论,详见老罗(罗升阳)的博客:
Android系统在新进程中启动自定义服务过程(startService)的原理分析
Android应用程序启动过程源代码分析
ActivityManagerNative.getDefault()源码调用如下:

/**     * Retrieve the system's default/global activity manager.     */    static public IActivityManager getDefault() {        return gDefault.get();    }
private static final Singleton gDefault = new Singleton() {        protected IActivityManager create() {            IBinder b = ServiceManager.getService("activity");            if (false) {                Log.v("ActivityManager", "default service binder = " + b);            }            IActivityManager am = asInterface(b);            if (false) {                Log.v("ActivityManager", "default service = " + am);            }            return am;        }    };

该单例模式实现方式中的Java设计模式有: 单例模式, 模板方法模式mInstance = create();
再加一个使用示例如下:

public class SingletonTest {    private static final Singleton gDefault = new Singleton(){        @Override        protected SingletonTest create() {            return new SingletonTest();        }    };    private SingletonTest(){}    public static SingletonTest getInstance(){        return gDefault.get();    }}

该单例模式的实现方式其实是采用了静态内部类.

public class Singleton {    private static class Holder {        private static Singleton singleton = new Singleton();    }    private Singleton(){}    public static Singleton getSingleton(){        return Holder.singleton;    }}

这种方式利用了类加载机制。既做到了延时加载,并且能保证线程安全,我们可以把Singleton实例放到一个静态内部类中,这样就避免了静态实例在Singleton类加载的时候就创建对象,并且由于静态内部类只会被加载一次,所以这种写法也是线程安全的。

本文参考自:
Java单例模式——并非看起来那么简单
你真的会写单例模式吗——Java实现
你真的会写单例模式吗——Java实现

不当之处,欢迎指正
android交流群:230274309

更多相关文章

  1. Activity为singleTask模式时的生命周期
  2. android donut 飞行模式分析
  3. Android四种Activity的加载模式
  4. android面试-面试知识点总结
  5. Android(安卓)Activity启动模式分析
  6. Android四种Activity的加载模式
  7. Android05
  8. Android静态注册广播receiver检测WIFI连接状况变化
  9. Android静态注册广播receiver检测WIFI连接状况变化

随机推荐

  1. android 往sd卡中写入文件
  2. repo/git Android/CyanogenMod srouce co
  3. 【Debug-aapt2】error: style attribute
  4. Android(安卓)禁止横竖屏切换
  5. 2011.09.07(2)——— android 跨进程通信之
  6. 未命名 3
  7. Android(安卓)SSL BKS证书生成
  8. 按钮的多样话 selector的使用
  9. Compile C/C++ In Eclipse for Android
  10. 在Android(安卓)Studio上进行OpenCV3.1开