Android设计模式--Android源码中的设计模式之Singleton,ActivityManagerService,WindowManagerService

内容简介:


Android Framework层提供了大量的组件,例如,HardwareService,PowerManagerService,WindowManagerService...,所有的app
都可以调用这些组件提供的接口,从而完成相应的功能。这些组件都是以单例模式(Singleton)存在于系统中。

本节就来看看这种单例模式在Android Framework源码中的具体运用。

1. Framework层的代码简介:

Android中,整个framework层的组件的初始化是在SysteServer.java中完成的,这些组件都是系统级组件,包括HardwareService,PowerManagerService,WindowManagerService
  BluetoothDeviceService,ActivityManagerService......,具体代码在ServerThread类的run函数中。大家也一定知道,在Google的关于Android的介绍文档中,framework层不就这些东西么。
  所以,看上去神秘的Framework,其实也就一层窗户纸而已,然而这层窗户纸可不薄啊!
  哦,差点偏题目了,还是来说singleton吧(我说过嘛 ,这层窗户纸很厚的啊,呵呵)。基本上,上面描述的这些组件都是单实例的。

2. PowerManagerService和ActivityManagerService的单例实现:

下面,就以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的其它函数了。


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

   (1). Builder.java:
           class Builder {

               private static Builder singleton = new Builder();
 
               public static Builder getInstance() {
               return singleton;
               }
               ......
           }
    (2). DrmRightsManager, OSMemory......


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

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值