欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android源码Singleton的代码分析

程序员文章站 2022-10-16 16:29:57
0x01:activitymanagernative中的singleton 今天在研究activitymanagernative的时候看到一段代码: private static final s...

0x01:activitymanagernative中的singleton

今天在研究activitymanagernative的时候看到一段代码:

private static final singleton gdefault = new singleton() {
  protected iactivitymanager create() {
ibinder b = servicemanager.getservice("activity");
if (false) {
 log.v("activitymanager", "default service binder = " + b);
}
iactivitymanager am = asinterface(b);
if (false) {
 log.v("activitymanager", "default service = " + am);
}
return am;
  }
 };

该类是位于”android.util.singleton”中,遂在该目录下找到该文件。打开下,发现代码其实很简单

package android.util;

/**
 * singleton helper class for lazily initialization.
 *
 * modeled after frameworks/base/include/utils/singleton.h
 *
 * @hide
 */
public abstract class singleton {
 private t minstance;

 protected abstract t create();

 public final t get() {
  synchronized (this) {
if (minstance == null) {
 minstance = create();
}
return minstance;
  }
 }
}

使用:

 // 以匿名内部类的方式发布出去,注意这里是有static final修饰的
 private static final singleton gdefault = new singleton() {
  protected iactivitymanager create() {
ibinder b = servicemanager.getservice("activity");
if (false) {
 log.v("activitymanager", "default service binder = " + b);
}
iactivitymanager am = asinterface(b);
if (false) {
 log.v("activitymanager", "default service = " + am);
}
return am;
  }
 };

 /**
  * retrieve the system's default/global activity manager.
  */
 static public iactivitymanager getdefault() {
  return gdefault.get();
 }

该类主要利用的是泛型,再结合懒加载的方式来实现的。注意到该类是被隐藏的,所以开发者其实是不能使用到这个的。当然我们可以自己拷贝一个出去,用于我们的项目,以便提高封装。