1.原生Keyguard简单探究:
IKeyguardStateCallback.java文件是out底下生成的。因为在framework底下有IKeyguardStateCallback.aidl文件。所有编译之后就会由编译系统生成。
stub内部类有onTransact接口,底下还有个Proxy接口
public class KeyguardStateMonitor extends IKeyguardStateCallback.Stub
即KeyguardStateMonitor这个类继承了系统生成的IKeyguardStateCallback类的子类Stub,获得了onTransact接口。KeyguardStateMonitor
是用来响应别人的transact的,是一个服务端。
比如onShowingStateChanged方法。客户端通过调用之后,Proxy会调用mRemote.transact(Stub.TRANSACTION_onShowingStateChanged).然后stub类呢就进行相应onTransact,调用this.onShowingStateChanged(_arg0)。而这个stub是个抽象类
要去寻找他的实现类,调用才能完成。
而前面我们已经找过了KeyguardStateMonitor就是子类。那很明显了
××××××××××××××××××××××××××××
那服务端找到了,我们要去找到客户端啊。肯定是在keyguard里啊,服务端在framework里,keyguard在SystemUI底下。
先说说KeyguarService吧,他是一个Service,后台不断运行的。
从Binder角度来说,他是一个服务端:
private final IKeyguardService.Stub mBinder = new IKeyguardService.Stub()
private final ServiceConnection mKeyguardConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
if (DEBUG) Log.v(TAG, "*** Keyguard connected (yay!)");
//在这构造的
mKeyguardService = new KeyguardServiceWrapper(mContext,
IKeyguardService.Stub.asInterface(service));
if (mKeyguardState.systemIsReady) {
// If the system is ready, it means keyguard crashed and restarted.
mKeyguardService.onSystemReady();
// This is used to hide the scrim once keyguard displays.
mKeyguardService.onScreenTurnedOn(new KeyguardShowDelegate(
mShowListenerWhenConnect));
mShowListenerWhenConnect =