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

更多相关文章

  1. Android(安卓)NDK之二:创建NativeActivity
  2. Android(安卓)4.03 编译系统------lunch
  3. animation of android (2)
  4. Android(java)学习笔记86:案例短信发送器
  5. 全新 Android(安卓)注入器:Dagger 2(一)
  6. Android的IPC机制Binder的详解(转发)
  7. Android(安卓)tcpdump 抓包
  8. Android(安卓)无线启动过程分析 无线启动过程分析
  9. 箭头函数的基础使用

随机推荐

  1. android MTK modem编译方法
  2. android蓝牙开发入门到精通2---查找可见
  3. Android中对话框的工具类
  4. android百度地图 SDK v3.5.0
  5. Android 设置全屏显示的方法
  6. Phone Gap开发一:整合jQuery Mobile开发An
  7. 银联手机支付 手机客户端有几个?
  8. android 单击 切换图片 --- 注意图片大小
  9. 使用android 隐藏命令
  10. 深入解析RxJava源码(一)Observable对象的构