美容小组,要是能施展下周星星同学的还我漂漂拳,岂不快哉。 OK,闲话打住,咱开始正文。
本文主要内容:
1、分析锁屏界面的组成 ;
2、基于源代码分析锁屏相关类 ;
3、提出一种在框架取消锁屏的方法 。
花了一些时间研究Android原生的锁屏框架---Keyguard,今天就慢慢的讲解下我自己对这个模块的总结,因为目前还处于
理论学习的状况,很多细节以及功能上的实现有待后续的补充完整。
本文分析适合Android2.2和2.3版本,Android4.0尚不清楚。整个锁屏源码基本上完全一样,只是改变了文件存放路径而已。
本文分析版本具体是Android2.3版本。
源文件路径主要有两个:
frameworks\base\policy\src\com\android\internal\policy\impl\ ---->锁屏框架
frameworks\base\core\java\com\android\internal\widget\ ----> 提供了一些的自定义View.
一、锁屏界面的组成
通常 Android手机上大家常见的界面只有一种,成功后即可解锁进入界面了。其实在Android手机中,正常的锁屏界面由
两种不同性质的界面组成:
第一种界面称之为LockScreen界面(为了叙述方便,我们姑且称为“解锁界面),即我们通常所见到的界面,手机厂商一般定制
该界面。界面如下所示:
该界面对应自定义View的是LockScreen.java类
路径位于:frameworks\policies\base\phone\com\android\internal\policy\impl\LockScreen.java
第二种界面称之为UnLockScreen(为了后文叙述方便,我们姑且称为“开锁界面”),一般由Android源码提供,有如下四种:
①、图案开锁界面 ---- PatternUnlockScreen.java类 (自定义LinearLayout)
路径位于:frameworks\policies\base\phone\com\android\internal\policy\impl\PatternUnlockScreen.java
界面显示为:
②、PIN开锁界面 ---- SimUnlockScreen.java 类 (自定义LinearLayout)
路径位于:frameworks\policies\base\phone\com\android\internal\policy\impl\SimUnlockScreen.java
界面显示为: (图片省略)
③、密码开锁界面 ---- PasswordUnlockScreen.java类 (自定义LinearLayout)
路径位于:frameworks\policies\base\phone\com\android\internal\policy\impl\PasswordUnlockScreen.java
界面显示为:
④、GoogleAccount 开锁界面 ,即Google账户开锁界面。一般用于当用户输入密码错误次数超过上限值时,系统会提示
你输入Google账户去开锁。注意:开启它需要你手动设置账户与同步,否则该界面是不会出来的。
对应的源文件是: AccountUnlockScreen.java类 (自定义LinearLayout)
路径位于:frameworks\policies\base\phone\com\android\internal\policy\impl\AccountUnlockScreen.java
界面显示为:
可以按照如下办法选择开启哪一种开锁界面: 设置—>位置和安全—>设置屏幕锁定 ,具体选择那种开锁界面。
显示规则
当然,这两种界面的组合也是有很多变化的,总的规则如下:
首先显示LockScreen界面,接着判断是否开启了UnLockScreen界面,如果设置了UnLockScreen界面,则进入对应的
UnLockScreen界面去解锁,才算成功解锁。但,存在一种特殊的情况,就是假如我们选择了图案 UnLockScreen界面,是不会
显示LockScreen界面,而只会显示UnLockScreen界面。
二、锁屏界面的实现
我们知道, 任何一种界面都是由各种View/ViewGroup(当然包括自定义的)组成的,然后根据系统对应的状态值的改变去更新
这些View的显示状态,锁屏界面自然也是如此。锁屏界面的实现最顶层是采用了FrameLayout去控制的,当然内部也嵌套了很
多层,内嵌层数的增多的一点好处就是我们可以分开而治,具体针对每层去做相应的更新。难处就是看代码看的很蛋疼。
当界面复杂时,我不得不提Google为开发人员提供的一款优秀工具了---Hierarchy Viewer ,通过它,我们很清晰的弄明白整
个View树的继承层次,一个布局结构,当然,看源代码也是必须的。
关于Hierarchy Viewer的使用请参考该博客:
《Android 实用工具Hierarchy Viewer实战》
整个锁屏界面的继承层次如下(部分以及设置了图案开锁界面),更加完整的图请使用Hierarchy Viewer 工具查看。