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. Android(安卓)数字格式化
  2. Android用开发者模式进行调试时出现的问题及解决方案
  3. Android使用Fragment嵌套Fragment的模式实现界面滑动
  4. Android(安卓)AP模式下获取SSID/PASSWORD
  5. Android(安卓)侦测手势的内部类
  6. Android(安卓)8.0 Tv 修改以太网ip地址 掩码 网关 DNS及DHCP和静
  7. Activity为singleTask模式时的生命周期
  8. Android源码中的单例模式android.util.Singleton
  9. android donut 飞行模式分析

随机推荐

  1. Android九宫格抽奖
  2. android p vts VtsTrebleVendorVintfTest
  3. Android Tips
  4. maven 工程转换成 gradle 工程
  5. android 颜色对应值
  6. Android在标准linux基础上对休眠唤醒的实
  7. Android下载(外文)
  8. Android ViewPager的简单使用
  9. Android Studio build.gradle 编码配置UT
  10. Ubuntu 及windows 环境下android(Launcher