android Keyguard分析

Keyguard类图

Keyguard有四种解锁界面

PatternUnlockScreen.java类        图案开锁界面 

SimUnlockScreen.java 类           PIN开锁界面

PasswordUnlockScreen.java类      密码开锁界面

AccountUnlockScreen.java类       Google账户开锁界面


Keyguard源代码位于frameworks\base\policy\src\com\android\internal\policy\impl

一些自定义view --->frameworks\base\core\java\android\widget

Keyguard中各类的作用

LockPatternKeyguardView 继承至FrameLayout :

作为LockScreen和UnLockScreen的载体,用来控制显示LockScreen还是UnLockScreen界面。

LockScreen 继承至FrameLayout    

PatterUnlockScreen   ViewGroup类型 : 图案解锁界面

KeyguardViewHost继承至FrameLayout, 该ViewGroup作为顶层View,作为WindowManager的装饰对象添加至窗口。

 

KeyguardScreen 类    接口 ----> 

功能:该接口的主要功能是为每个需要显示的界面:LockScreen或者UnLockScreen定义了四个方法,使其在不同的状态能够得到相应处理。优点就是:  利用设计原则的面向 接口编程,减少对具体对象的依赖。

 

KeyguardScreenCallback类  接口 ---->其唯一实现类位于LockPatternKeyguardView类的内部类

功能:每个需要显示的界面:LockScreen或者UnLockScreen都保存了该对象的唯一实例,用来向控制界面汇报情况。

 

KeyguardViewCallback类  接口  ----> 其唯一实现类是   KeyguardViewMediator

功能: 提供了一些接口用来接受用户操作Screen的结果。

 

KeyguardWindowController类 接口 ---->  其唯一实现类是KeyguardViewManager

功能:提供通用接口,判断该界面是否需要显示输入法窗口。

 

KeyguardViewManager类 ----> 

功能:包装了WindowManager功能了,提供了添加、删除锁屏界面的功能。

 

KeyguardUpdateMonitor类 

功能:该类的主要功能就是根据监视系统状态值的改变(例如:时间、SIM卡状态、电池电量;使用广播监听),根据这种状态值的改变回调监听了该状态信息的对象实例。

 

LockPatternKeyguardView类  (自定义ViewGroup)

功能:作为LockScreen和UnLockScreen界面的载体,控制显示哪个界面。

 

KeyguardViewBase类 抽象类  (自定义ViewGroup)

功能:为LockPatternKeyguardView提供了一组通用的方法 。需要值得注意的方法就是他对某些KeyEvent的监听,

当他消费监听到这些KeyEvent,我们的App就监听不到这些KeyEvent了 。常用的有KEYEVENT_VOLUME_UP/DOWN等。

 

  KeyguardViewProperties接口 ----> 其唯一实现类是是LockPatternKeyguardViewProperties

功能:提供了创建界面的通用方法。

 

LockPatternKeyguardViewProperties类 

功能:创建一个LockPatternKeyguardView对象 .

KeyguardViewMediator核心类 ,该类是唯一实现了KeyguardViewCallback的类

功能:该类提供了一些接口,由PhoneWindowManager)去访问控制Keyguard.... 

  该类的初始化是在PolicyWindowManager的构造函数中创建的.

 

GlobalActions.java 

全局行为,这段代码就是处理锁屏界面长按Power键弹出的Dialog。关于静音模式/飞行模式和关机的。

 

IconUtilities.java

图标工具,图片处理的工具类,提供了一个drawable转bitmap的方法,还有个绘制bitmap按下的方法.


一些重要类的实例化:


PhoneWindowManager对象WindowManagerService.java中实例化,并在WindowManagerService的PolicyThread线程运行时初始化。
final WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager();

    static class PolicyThread extends Thread {
… …

        public void run() {
            Looper.prepare();
… …	
            mPolicy.init(mContext, mService, mService, mPM);//进入PhoneWindowManager中的init方法
… …	
            Looper.loop();
        }
    }

PhoneWindowManager .java类中,实例化KeyguardMediator对象
    public void init(Context context, IWindowManager windowManager,
            WindowManagerFuncs windowManagerFuncs,
            LocalPowerManager powerManager) {
        mContext = context;
		… …
        mKeyguardMediator = new KeyguardViewMediator(context, this, powerManager);
		… …
}

KeyguardViewMediator构造函数中实例化PowerManager的三个锁及KeyguardUpdateMonitor、LockPatternKeyguardViewProperties、KeyguardViewManager对象。

  public KeyguardViewMediator(Context context, PhoneWindowManager callback,
            LocalPowerManager powerManager) {
        mContext = context;
        mRealPowerManager = powerManager;
        mPM = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        //保证在 keyguard显示时能够显示一段时间后屏幕才能睡眠
        mWakeLock = mPM.newWakeLock(
                PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP,
                "keyguard");
        mWakeLock.setReferenceCounted(false);
        //用于在keyguard显示要打开时能够保持设备唤醒
        mShowKeyguardWakeLock = mPM.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "show keyguard");
        mShowKeyguardWakeLock.setReferenceCounted(false);
    	   //PhoneWindowManager截获事件进行触发,用于在用户按键或鼠标移动时唤醒设备便于对keyguard进行操作
        mWakeAndHandOff = mPM.newWakeLock(
                PowerManager.PARTIAL_WAKE_LOCK,
                "keyguardWakeAndHandOff");
        mWakeAndHandOff.setReferenceCounted(false);

        … …
        mUpdateMonitor = new KeyguardUpdateMonitor(context);

        mLockPatternUtils = new LockPatternUtils(mContext);
        mKeyguardViewProperties
                = new LockPatternKeyguardViewProperties(mLockPatternUtils, mUpdateMonitor);

        mKeyguardViewManager = new KeyguardViewManager(
                context, WindowManagerImpl.getDefault(), this,
                mKeyguardViewProperties, mUpdateMonitor);
		… …
}

在KeyguardViewManager 的show中实例化KeyguardViewHost、LockPatternKeyguardView对象。

    public synchronized void show() {
… …
            mKeyguardHost = new KeyguardViewHost(mContext, mCallback);
… …
        if (mKeyguardView == null) {
            if (DEBUG) Xlog.d(TAG, "keyguard view is null, creating it...");
            mKeyguardView = mKeyguardViewProperties.createKeyguardView(mContext, mUpdateMonitor, this);
            mKeyguardView.setId(R.id.lock_screen);
            mKeyguardView.setCallback(mCallback);
	… …
}	
}
在LockPatternKeyguardView的createLockScreen和createUnlockScreenFor函数中创建加锁和解锁屏幕.

Keyguard启动时序图:


Keyguard从屏亮---->屏灭, 再从屏灭--->屏亮,过程中两次按键时序图




时序图下载地址http://download.csdn.net/detail/ldinvicible/4761861


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值