android版本为5.1
Keyguard和SystemUI模块都在frameworks/base/packages目录下面
Keyguard模块里面并没有activity关键字
那么锁屏界面是如何而来的了
Keyguard的启动是从WindowManagerService的systemReady开始的
之后调用的是PhoneWindowManager(是WindowManagerPolicy的子类)的systemReady方法
再调用KeyguardServiceDelegate的onSystemReady方法
再调用KeyguardServiceWrapper的onSystemReady方法
再调用KeyguardService内部类的onSystemReady方法
再调用KeyguardViewMediator的onSystemReady方法
进入到KeyguardViewMediator的onSystemReady方法里面
看到有一个方法doKeyguardLocked(null),
进入里面看到有个方法showLocked(options).
进入到showLocked方法里面
里面有 Message msg = mHandler.obtainMessage(SHOW, options);
mHandler.sendMessage(msg);
找到handleMessage
switch (msg.what) {
case SHOW:
handleShow((Bundle) msg.obj);
break;
...
}
进入到handleShow方法里面
里面有 mStatusBarKeyguardViewManager.show(options);
进入到StatusBarKeyguardViewManager里面的show方法
里面有mStatusBarWindowManager.setKeyguardShowing(true);
然后就绘制出了锁屏界面
其实紧急呼救入口没有只是因为代码里有个开关将他关闭了
我们只需要找到相应的位置将他打开就可以了
在keyguard模块中我们找到了类EmergencyButton,他是一个Button
这个类里面定义这个button的信息,和一些跳转
IEmergencyButtonExt是一个接口,它是EmergencyButton客制化的操作者
里面有一个抽象方法showEccInNonSecureUnlock,它是用来控制我们是否应该
将EmergencyButton显示出来
然后找到了这个接口的实现类DefaultEmergencyButtonExt
直接在他重写的方法里面将return false改为return true就可以了
在编译时需要注意,要先编译Keyguard模块,然后再编译SystemUI模块,
因为SystemUI在编译时用到了Keyguard的jar包
编译完之后,将SystemUI.apk push到手机中就可以看到
锁屏界面出现了紧急呼救的按钮