Android Framework源码阅读计划
Android Framework源码阅读计划(1)——LocationManager.java
Android Framework源码阅读计划(2)——LocationManagerService.java
前言
本篇主要介绍LocationManagerService中用的设计模式和原则,由于LocationManagerService是个非常重要的类,也是非常大的类,可能会有很多的点没有讲到,水平有限,欢迎补充指正。
主要设计单例模式,里氏替换原则,建造者模式
一、LocationManagerService
管理 LocationProviders 并发布位置更新和警报的服务类。
以上就是源码关于这个类的注释,非常简单。代码是最好的注释,通过类名基本可以猜到这个类的主要作用。上篇有提到,LocationManager作为外观类,将LocationManagerService的复制性隐藏了,也能体现出LocationManagerService的复杂。
二、使用的设计模式和原则
2.1 单例模式
2.1.1 定义
单例属于创建型模式,确保系统中某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
优点:减少了内存开支,系统的性能开销
2.1.2 源码
从后缀就可以看到,这是一个Service,而且还是系统的服务。其中有个内部类Lifecycle继承了SystemService,用来管理LocationManagerService的生命周期。
/**
* Controls lifecycle of LocationManagerService.
*/
public static class Lifecycle extends SystemService {
private final SystemInjector mSystemInjector;
private final LocationManagerService mService;
public Lifecycle(Context context) {
super(context);
mUserInfoHelper = new LifecycleUserInfoHelper(context);
mSystemInjector = new SystemInjector(context, mUserInfoHelper);
// LocationManagerService初始化
mService = new LocationManagerService(context, mSystemInjector);
}
@Override
public void onStart() {
}
@Override
public void onBootPhase(int phase) {
}
...
}
基本上所有系统服务都是以该方法实现控制生命周期的,也是通过这种方式实现的单例模式。由于注册系统服务不是多线程的,所以不需要通过双重校验等方式来确保单例。
//SystemServiceRegistry.java
registerService(Context.LOCATION_SERVICE, LocationManager.class,
new CachedServiceFetcher<L