- 浏览: 1579557 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (289)
- java 语法基础 (51)
- spring (8)
- mvc struct /Ant --build.xml (8)
- SOA (0)
- oracle 9i/10g (23)
- sql server 2000-2005 (3)
- 数据库基础知识 (6)
- 设计模式与软件架构 (10)
- Hibernate 持久化 (9)
- J2SE/J2EE/J2ME/AJAX 技术 (8)
- JSF 技术 (3)
- JAVA 图形化 (0)
- JMS (40)
- Eclipse 3.2 IDE 开发技巧 (13)
- 项目处理方法集合 (2)
- html/jsp/javascript (2)
- Unix/Linux (9)
- j2me/ARM/windriver/嵌入式 (4)
- 电信科学 (8)
- jsp (1)
- c/c++ (1)
- LZW压缩算法(java) (2)
- Android (77)
- 版本管理git/svn (2)
最新评论
-
huihai:
有demo吗?
NamingStrategy实现动态表名映射 -
cangbaotu:
推荐给大家一些有用的爬虫源码:https://github.c ...
网络爬虫(源代码参考) -
tuspark:
除了.classpath文件以外,.project文件也应该了 ...
Eclipse .classpath文件浅谈 -
tuspark:
造成eclipse自动关闭的原因有很多,这里有很多介绍:ecl ...
eclipse 自动关闭 解决方案 -
DEMONU:
网上都是这些,这种文章。。。
ActiveMQ中的消息持久性
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的。一定要真正理解你要创建的类,从而采用最适合的方式去构造它。
发表评论
-
APN(default、mms、supl、dun、hipri接入点类型的区别)
2013-10-10 19:31 45610设置APN上网时,大家可能经常遇到这个问题:为什么有时要填写 ... -
AMR音频编码器概述及文件格式分析
2013-10-10 19:29 3916全称Adaptive Multi-Rate,自适应多速率编码 ... -
pad 强制加载 Hdpi资源 (2.3 dpi < 240)
2012-07-16 16:47 0pad 强制加载 Hdpi资源 (2.3 dpi < ... -
android 设计模式-享元模式
2011-12-16 23:01 2157享元(FlyWeight)模式,原意是“轻量级”模式,它用来解 ... -
statusbar 2.3
2011-11-08 16:04 1246以前我的文章分析过Stat ... -
android 输入法默认设置
2011-07-07 14:00 7150设置默认输入法 在 frameworks\base\co ... -
Android Media Scanner Process
2011-06-06 22:58 3363下面是系统图 Medi ... -
handler与多线程消息处理
2011-06-04 13:42 8247在Android下面也有多线程的概念,在C/C++中,子线程可 ... -
android light
2011-03-24 16:15 3383背光设置是在:设置->声音和显示->亮度,通过进度 ... -
PowerManagerService sensor
2011-03-22 20:06 2639默认分类 2010-12-24 14:34:55 阅读144 ... -
Android 开发之 Services 服务
2010-11-02 18:21 4200Service Service ... -
深入学习android之AlarmManager
2010-11-01 16:50 34685对应AlarmManage有一个Alarm ... -
eclipse+android+ddms+adt
2010-09-14 10:30 8396用eclipse + ADT作为android ... -
Menus
2010-09-05 19:01 1760Android Menus 文章分类:移动开发 1.O ... -
Android开机自启动应用开发
2010-08-28 10:07 4560目前需要开发一个开机自启动的GTD应用程序来提醒用户的 ... -
Android2.1_Launcher学习笔记
2010-08-11 13:40 3810文章分类:移动开发 好么,2.0的源码没看几天,2.1的 ... -
Browsing Android Source in Eclipse
2010-08-09 16:00 3395Google’s Android SDK includes ... -
android 编译
2010-08-07 16:31 24951 我的系统是Ubuntu 8.04 * 2 系统上 ... -
Ubuntu linux 右键添加"以管理员身份打开","在终端中打开"
2010-08-02 15:04 4555Ubuntu linux 右键添加"以管理员身份打开 ... -
自制android1.5的源码包
2010-08-02 13:44 1868最近打算玩下android,听hong老大说最好看看源码。而a ...
相关推荐
Android单例模式的几种方法总结 因为单例模式过于简单,下面我就直接上代码了。 简单式: public class Single{ private static Single single=new Single(); public static Single instance(){ return singlel;...
主要是描述单例的简单代码,里面都有详细的注释,大家请仔细看
闲聊群 : 668524118 本群主要用于编程技术 ,及创意作品 ,思维架构的交流 ,欢迎喜欢创新 ,热爱生活的朋友加入 !
单例模式详解
这种写法可以保证线程安全.两个if都是不能去掉的.如果去掉第一个if: 那么所有的线程都会到这里来先获取锁,然后判断singleton是否为空.所有线程都会串行
单例模式是最简单的设计模式之一,但是对于Java的开发者来说,它却有很多缺陷。在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化(serialization)时...
android 单例模式 干货 告诉你哪种单例模式最实用 最好用 不再迷茫
Android处理内存泄漏的代码例子。用于演示避免内存泄漏的几种方法,包括:关闭游标、重用适配、回收图像、注销监听、释放引用。
在Android开发中很少有activity service broadcast 单例的综合使用,我写的这个例子已经能运行了希望能和大家交流学习
单例模式的几种实现方式Demo
关于Android Service的简单实例:属于start service类型,而不是bound service。
主要介绍了单例模式 Singleton 简单实例设计模式解析的相关资料,需要的朋友可以参考下
用此方法代替Toast吐字,防止toast连弹。直接调用MyToast.showToast(context,"msg",1);
当Android开发处理错误信息时,经常会以Dialog的形式显示错误信息,但是每次都new一个Dialog,很麻烦,也增加程序的开销,所以今天就分享一种自定义单例AlertDialog public class AlertDialog { private static ...
Android Singleton单例模式运用详解
自定义toast提示,可设置,做了封装
Android Activity单例
android SQLite DBHelper 单例模式 实现 dbhelper=DBHelper.getInstance(this);
http://blog.csdn.net/i_do_can/article/details/51136906