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的。一定要真正理解你要创建的类,从而采用最适合的方式去构造它。

4. 题外话:
作为设计模式的缩影,我的新浪相册用singleton2008(因为是2008年创建的)来命名,如有兴趣,欢迎读者去访问:
http://photo.blog.sina.com.cn/singleton2008

更多相关文章

  1. No.11 使用firewall配置的防火墙策略的生效模式
  2. Android退出应用最优雅的方式
  3. APK不用su的方式来获取ROOT权限
  4. Android中把assets目录下所有图片转换成bitmap存入list集合
  5. android 学习 ----控件学习 选项卡。
  6. Android之向中国天气网发送GET请求获取JSON数据实例
  7. Android(安卓)包管理流程之包的解析
  8. Android(安卓)4.2 JellyBean Graphic Component -- SurfaceFling
  9. 几本二手书出售Android/WP/设计模式算法等,基本全新

随机推荐

  1. Android(安卓)自定义URL Scheme
  2. 从0到1 Android安全学习之路 -- 环境篇
  3. 【Android的从零单排开发日记】之入门篇(
  4. 新书内容连载(3):Android(安卓)SDK中常用命
  5. android流媒体播放器
  6. 深度了解Flutter APP的构建流程
  7. 饭后Android(安卓)第六餐-Bmob云后端(Bmob
  8. Android(安卓)***测试学习手册(二)准备实验
  9. android studio 插件 - .ignore
  10. ubuntu16.04 compile android L error