`

android 单例

阅读更多

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

分享到:
评论

相关推荐

    Android单例模式的几种方法总结

    Android单例模式的几种方法总结 因为单例模式过于简单,下面我就直接上代码了。 简单式: public class Single{ private static Single single=new Single(); public static Single instance(){ return singlel;...

    android单例

    在Android开发中,单例模式是一种常见的设计模式,它用于控制类的实例化过程,确保在应用程序中只有一个类实例存在。这种模式对于管理共享资源、全局状态或昂贵的对象创建非常有用。下面我们将深入探讨Android中的...

    Android线程池+单例模式+webService

    本项目涉及了三个核心概念:线程池、单例模式和WebService,这些都是Android应用开发中的重要知识点。 首先,让我们来深入理解线程池。线程池是一种多线程处理形式,预先创建了多个线程,当需要执行任务时,直接从...

    Android单例模式

    ### Android中的单例模式详解 #### 一、概念与特性 单例模式是软件工程中常用的设计模式之一,尤其在Java编程中非常普遍。它的核心在于确保某类在整个应用程序生命周期中仅存在一个实例,并且该类能全局访问该实例...

    xfhy#Android-Notes#7.单例模式的双重检查锁为什么必须加volatile1

    这种写法可以保证线程安全.两个if都是不能去掉的.如果去掉第一个if: 那么所有的线程都会到这里来先获取锁,然后判断singleton是否为空.所有线程都会串行

    android SQLite DBHelper 单例模式 实现

    android SQLite DBHelper 单例模式 实现 dbhelper=DBHelper.getInstance(this);

    单例模式,single

    ### 单例模式详解 #### 概述与应用场景 单例模式是一种常用的设计模式,它的主要目的是确保某个类仅有一个实例,并提供一个全局访问点。这种模式非常适合那些在整个应用程序生命周期中只需要一个实例的对象,例如...

    activity service broadcast 单例模式 的综合使用

    4. **单例模式的应用**:在Android开发中,单例模式常用于创建一个全局唯一的实例,如数据库连接、网络请求工具类等。常见的单例实现方式有懒汉式(线程不安全、线程安全)和饿汉式。为确保线程安全,通常使用双检锁...

    Android处理内存泄漏的代码例子

    在Android开发中,内存泄漏是一个严重的问题,它会导致应用程序占用过多内存,影响性能甚至导致应用崩溃。本示例代码着重展示了如何避免Android应用中的内存泄漏,主要包括五个关键方面:关闭游标、重用适配器、回收...

    android-设计模式-单例模式(干货)

    android 单例模式 干货 告诉你哪种单例模式最实用 最好用 不再迷茫

    Android Service简单实例

    在Android应用开发中,Service是四大组件之一,用于在后台执行长时间运行的操作,即使用户界面关闭也能继续工作。本篇文章将深入探讨`startService`类型的Android Service,通过一个简单的实例来展示其工作原理和...

    单例模式的几种实现方式

    单例模式是软件设计模式中的一种经典模式,它限制了类的实例化过程,确保一个类在整个系统中只有一个实例存在。这种模式在处理全局资源、线程共享对象以及频繁使用的对象时尤其有用,因为它可以避免频繁创建和销毁...

    Android-自定义toast提示可设置做了封装

    在Android应用开发中,系统默认的Toast提示虽然简单易用,但往往无法满足开发者对于个性化提示的需求。为了提供更丰富的提示效果和更好的用户体验,开发者常常会选择自定义Toast。本资源"Android-自定义toast提示可...

    fragment活动栈单例

    总结来说,Fragment活动栈单例是Android开发中的一个重要概念,它涉及到了Fragment的生命周期管理、回退栈的使用以及单例模式的应用。理解和掌握这一模式对于开发高效、用户体验优秀的Android应用至关重要。

    单例Toast,阻止toast连弹

    用此方法代替Toast吐字,防止toast连弹。直接调用MyToast.showToast(context,"msg",1);

    Android自定义单例AlertDialog详解

    当Android开发处理错误信息时,经常会以Dialog的形式显示错误信息,但是每次都new一个Dialog,很麻烦,也增加程序的开销,所以今天就分享一种自定义单例AlertDialog public class AlertDialog { private static ...

    Android Singleton单例模式Demo

    在Android开发中,单例模式(Singleton)是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在管理共享资源、控制并发以及减少对象创建的开销等方面非常有用。本篇文章将深入讲解...

    android Dagger2局部单例使用

    本篇文章将深入探讨如何在Android应用中使用Dagger2实现局部单例。 首先,我们要理解什么是局部单例。单例模式是一种常见的设计模式,确保一个类只有一个实例,并提供一个全局访问点。在Dagger2中,我们可以使用`@...

Global site tag (gtag.js) - Google Analytics