目录
锁屏时序图
研究了将近两天的Android5.1 Keyguard锁屏机制,不得不说,各种饶。这里先把锁屏流程时序图贡献给大家:
使用的是线编辑工具ProcessOn,用来编辑时序图效果看起来不是太好。不过没有太大关系,这个时序图只是为了方便我们能清晰的对锁屏流程有个大致的了解,接下来,我会详细的分析每个类的具体流程。
声明:本文基于AndroidLollipop 5.1.1_r6版本进行的源码分析。
开机启动到PhoneWindowManager的systemReady方法
准备先从开机启动到PhoneWindowManager类的systemReady方法调用开始介绍。开机启动流程其实也很复杂,但是本文重点在于Keyguard锁屏的展示,所以这里只是大体列出如何从开机启动调用到PhoneWindowManager的systemReady()方法。具体流程如下:
init进程->zygote进程(java世界)->system server进程。
而在system server进程中,它的SystemServer.java中main函数会调用startOtherServices()方法,相关源码如下:
private void startOtherServices() {
WindowManagerService wm = null;
wm = WindowManagerService.main(context, inputManager,
mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
!mFirstBoot, mOnlyCore);
try {
wm.systemReady();
} catch (Throwable e) {
reportWtf("makeing Window Manager Service ready", e);
}
}
既然wm是WindowManagerServer类的实例,那就需要继续看一下这个类关于systemReady()方法的实现:
public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs {
final WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager();
public void systemReady() {
mPolicy.systemReady();
}
}
其中,mPolicy实例的生成依赖于Java的反射机制,具体流程如下:
public final class PolicyManager {
private static final String POLICY_IMPL_CLASS_NAME =
"com.android.internal.policy.impl.Policy";
private static final IPolicy sPolicy;
static {
try {
// 获取了Policy的类类型
Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME);
// 通过Policy的类类型获取Policy的对象实例
sPolicy = (IPolicy)policyClass.newInstance();
} catch (Exception e) {
}
}
public static Window makeNewWindowManager(Context context) {
return sPolicy.makeNewWindowManager(context);
}
}
// Policy中继续调用反射机制进行预加载
public class Policy implements IPolicy {
public Window makeNewWindowManager(Context context) {
return new PhoneWindowManager();
}
}
通过上述代码的跟踪,终于来到了我们时序图的第一个类PhonewWindowManager的systemReady()方法了。
锁屏加载流程
既然上述分析到了PhoneWindowManager,我们也就是按照时序图,根据时序图上的每个类,进行相关源码分析(重点难点的源码我会中文注释)。
PhoneWindowManager
路径
frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
源码:
public class PhoneWindowManager implements WindowManagerPolicy {
public void systemReady() {
// 调用Keygurad代理类的onSystemReady方法
mKeyguardDelegate = new KeyguardServiceDelegate(mContext);
mKeyguardDelegate.onSystemReady();
// ... 省略不相关源码
}
}
KeyguardServiceDelegate
路径:
frameworks/base/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java
源码:
public class KeyguardServiceDelegate {
protected KeyguardServiceWrapper mKeyguardService;
public void