- 浏览: 1589921 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (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 45821设置APN上网时,大家可能经常遇到这个问题:为什么有时要填写 ... -
AMR音频编码器概述及文件格式分析
2013-10-10 19:29 3953全称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 2191享元(FlyWeight)模式,原意是“轻量级”模式,它用来解 ... -
statusbar 2.3
2011-11-08 16:04 1280以前我的文章分析过Stat ... -
android 输入法默认设置
2011-07-07 14:00 7192设置默认输入法 在 frameworks\base\co ... -
Android Media Scanner Process
2011-06-06 22:58 3403下面是系统图 Medi ... -
handler与多线程消息处理
2011-06-04 13:42 8280在Android下面也有多线程的概念,在C/C++中,子线程可 ... -
android light
2011-03-24 16:15 3412背光设置是在:设置->声音和显示->亮度,通过进度 ... -
PowerManagerService sensor
2011-03-22 20:06 2670默认分类 2010-12-24 14:34:55 阅读144 ... -
Android 开发之 Services 服务
2010-11-02 18:21 4239Service Service ... -
深入学习android之AlarmManager
2010-11-01 16:50 34755对应AlarmManage有一个Alarm ... -
eclipse+android+ddms+adt
2010-09-14 10:30 8452用eclipse + ADT作为android ... -
Menus
2010-09-05 19:01 1787Android Menus 文章分类:移动开发 1.O ... -
Android开机自启动应用开发
2010-08-28 10:07 4589目前需要开发一个开机自启动的GTD应用程序来提醒用户的 ... -
Android2.1_Launcher学习笔记
2010-08-11 13:40 3870文章分类:移动开发 好么,2.0的源码没看几天,2.1的 ... -
Browsing Android Source in Eclipse
2010-08-09 16:00 3433Google’s Android SDK includes ... -
android 编译
2010-08-07 16:31 25221 我的系统是Ubuntu 8.04 * 2 系统上 ... -
Ubuntu linux 右键添加"以管理员身份打开","在终端中打开"
2010-08-02 15:04 4646Ubuntu linux 右键添加"以管理员身份打开 ... -
自制android1.5的源码包
2010-08-02 13:44 1900最近打算玩下android,听hong老大说最好看看源码。而a ...
相关推荐
Android单例模式的几种方法总结 因为单例模式过于简单,下面我就直接上代码了。 简单式: public class Single{ private static Single single=new Single(); public static Single instance(){ return singlel;...
在Android开发中,单例模式是一种常见的设计模式,它用于控制类的实例化过程,确保在应用程序中只有一个类实例存在。这种模式对于管理共享资源、全局状态或昂贵的对象创建非常有用。下面我们将深入探讨Android中的...
本项目涉及了三个核心概念:线程池、单例模式和WebService,这些都是Android应用开发中的重要知识点。 首先,让我们来深入理解线程池。线程池是一种多线程处理形式,预先创建了多个线程,当需要执行任务时,直接从...
### Android中的单例模式详解 #### 一、概念与特性 单例模式是软件工程中常用的设计模式之一,尤其在Java编程中非常普遍。它的核心在于确保某类在整个应用程序生命周期中仅存在一个实例,并且该类能全局访问该实例...
这种写法可以保证线程安全.两个if都是不能去掉的.如果去掉第一个if: 那么所有的线程都会到这里来先获取锁,然后判断singleton是否为空.所有线程都会串行
android SQLite DBHelper 单例模式 实现 dbhelper=DBHelper.getInstance(this);
### 单例模式详解 #### 概述与应用场景 单例模式是一种常用的设计模式,它的主要目的是确保某个类仅有一个实例,并提供一个全局访问点。这种模式非常适合那些在整个应用程序生命周期中只需要一个实例的对象,例如...
4. **单例模式的应用**:在Android开发中,单例模式常用于创建一个全局唯一的实例,如数据库连接、网络请求工具类等。常见的单例实现方式有懒汉式(线程不安全、线程安全)和饿汉式。为确保线程安全,通常使用双检锁...
在Android开发中,内存泄漏是一个严重的问题,它会导致应用程序占用过多内存,影响性能甚至导致应用崩溃。本示例代码着重展示了如何避免Android应用中的内存泄漏,主要包括五个关键方面:关闭游标、重用适配器、回收...
android 单例模式 干货 告诉你哪种单例模式最实用 最好用 不再迷茫
在Android应用开发中,Service是四大组件之一,用于在后台执行长时间运行的操作,即使用户界面关闭也能继续工作。本篇文章将深入探讨`startService`类型的Android Service,通过一个简单的实例来展示其工作原理和...
单例模式是软件设计模式中的一种经典模式,它限制了类的实例化过程,确保一个类在整个系统中只有一个实例存在。这种模式在处理全局资源、线程共享对象以及频繁使用的对象时尤其有用,因为它可以避免频繁创建和销毁...
在Android应用开发中,系统默认的Toast提示虽然简单易用,但往往无法满足开发者对于个性化提示的需求。为了提供更丰富的提示效果和更好的用户体验,开发者常常会选择自定义Toast。本资源"Android-自定义toast提示可...
总结来说,Fragment活动栈单例是Android开发中的一个重要概念,它涉及到了Fragment的生命周期管理、回退栈的使用以及单例模式的应用。理解和掌握这一模式对于开发高效、用户体验优秀的Android应用至关重要。
用此方法代替Toast吐字,防止toast连弹。直接调用MyToast.showToast(context,"msg",1);
当Android开发处理错误信息时,经常会以Dialog的形式显示错误信息,但是每次都new一个Dialog,很麻烦,也增加程序的开销,所以今天就分享一种自定义单例AlertDialog public class AlertDialog { private static ...
在Android开发中,单例模式(Singleton)是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在管理共享资源、控制并发以及减少对象创建的开销等方面非常有用。本篇文章将深入讲解...
本篇文章将深入探讨如何在Android应用中使用Dagger2实现局部单例。 首先,我们要理解什么是局部单例。单例模式是一种常见的设计模式,确保一个类只有一个实例,并提供一个全局访问点。在Dagger2中,我们可以使用`@...