`

android 单例

阅读更多

1. Framework层的代码:
  Android中,整个framework层的组件的初始化是在SysteServer.java中完成的,这些组件都是系统级组件,包括HardwareService,PowerManagerService,WindowManagerService
  BluetoothDeviceService,ActivityManagerService......,具体代码在ServerThread类的run函数中。大家也一定知道,在Google的关于Android的介绍文档中,framework层不就这些东西么。
  所以,看上去神秘的Framework,其实也就一层窗户纸而已,然而这层窗户纸可不薄啊!
  哦,差点偏题目了,还是来说singleton吧(我说过嘛 ,这层窗户纸很厚的啊,呵呵)。基本上,上面描述的这些组件都是单实例的。下面,就以PowerManagerService和ActivityManagerService为例,来说明一下。
  (1)PowerManagerService:
       整个系统中,只存在一个这样的实例,即在ServerThread类的run函数进行构造的
          power = new PowerManagerService();
       在构造完成之后,立刻调用了
       ServiceManager.addService(Context.POWER_SERVICE, power);
       将其加入到ServiceManager中。
       以后,如果其它地方要用到这个实例,只能通过
       ServiceManager.getService(POWER_SERVICE)
       来取得。这里特别要强调的是这种单实例的创建与使用方式:
       从理论上讲,PowerManagerService的构造函数并不是private的,而且也没有一个static的PowerManagerService变量存在,
       所以,用户或者framewrok层完全可以再new 一个PowerManagerService出来,从而使得系统中有关2个PowerManagerService实例存在,从语法上讲当然行得通,但是,
       这就违背了Android平台Framework中service的创建思想了。也就是说,如果你这样做,从整个框架或者设计上就完全是错误的。
       PowerManagerService单实例模式并不是通过一般的static变量来访问,而是通过ServiceManager的getService方法来访问的。
      
  (2)ActivityManagerService
       Activity,是不是很眼熟啊!正如你想的一样,ActivityManagerService是对app层的activity进行管理的.
       在ActivityManagerService.java中,有:
       static ActivityManagerService mSelf;
       public static ActivityManagerService self() {
        return mSelf;
       }
       典型的单例模式。然而,ActivityManagerService的构造也并不是如我们想象的那般简单。mSelf这个static变量的初始化颇有一番周折。
       首先,ActivityManagerService的构造函数是在什么时候被调用的呢?
       细看ActivityManagerService的创建过程:
       在AThread类的run函数中,有:
       ActivityManagerService mService;
      
       ActivityManagerService m = new ActivityManagerService();
      
       mService = m;
      
      
       public static final Context main(int factoryTest) {
       AThread thr = new AThread();
        thr.start();

        synchronized (thr) {
            while (thr.mService == null) {
                try {
                    thr.wait();
                } catch (InterruptedException e) {
                }
            }
        }

        ActivityManagerService m = thr.mService;
        mSelf = m;
        ......
        }
       
        而在SysteServer.java中的,有
        context = ActivityManagerService.main(factoryTest);
        哦,又返推回到ServerThread类的run函数中了。
        是的,这就是ActivityManagerService初始化的过程:
        1. ActivityManagerService.main(factoryTest)
                1). 创建AThread: AThread thr = new AThread();
                          (1). 创建ActivityManagerService: new ActivityManagerService();
                2). 将AThread创建的ActivityManagerService的实例赋给ActivityManagerService变量m;
                3)  将m赋给ActivityManagerService静态变量mSelf: mSelf = m;
        这样,就可以通过ActivityManagerService的self()来访问ActivityManagerService的其它函数了。

2.其它的单例模式代码:
     如果你以"singleton"为关键字,在Android源码中进行搜索,一定会发现很多类都是单例模式的。例如:
    (1). Builder.java:
           class Builder {

               private static Builder singleton = new Builder();
 
               public static Builder getInstance() {
               return singleton;
               }
               ......
           }
    (2). DrmRightsManager, OSMemory......
   
3. 总结:
   (1). Android中许多类都是单例模式的,意味着你不可以去再创建这样的实例,而只能引用;
   (2). 虽然Gof提出了23种设计模式,但是,我们完全可以基于它们开发出适合自己系统的设计模式,而并不是简单地照搬;
          从这几个例子可以看出 ,Google工程师的拿来主义运用的是多么地恰到好处;
   (3). 可见,如何实现单例模式,并不是只有Gof书中所说的方法,也并不一定是要求构造函数是private的。一定要真正理解你要创建的类,从而采用最适合的方式去构造它。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics