android systemui控件,SystemUI 系列(4):SystemBars 之锁屏

简介

锁屏是防止误触,或设备丢失后防止数据泄露的有效手段,在 8.1 之后,忘记锁屏密码将导致手机变砖,据说刷机或恢复出厂设置都无法重置,必须验证密码后才能继续使用手机,我还没试过 (ノ ̄▽ ̄)。

默认所有的 App 界面都位于锁屏之下,必须通过锁屏验证才能使用他们,防止信息泄露。只有 App 明确声明要求显示在锁屏之上时,才能在锁屏时弹出界面,即设置 FLAG_SHOW_WHEN_LOCKED 的 Window 才可以在锁屏之上显示。

在 8.0 之后,锁屏的代码被放到 SystemUI 中,成为 SystemUI 的子模块之一,资源文件在 res-keyguard 目录中,代码大部分都在 src/com.android.keyguard 和 src/com.android.systemui.keyguard 两个包中,锁屏模块类叫做 KeyguardViewMediator,也是 SystemUI 类的子类,在 SystemUIApplication 中被初始化。

也是接下来我们就来分析锁屏这个功能的具体实现和逻辑。

思考:如何自己实现锁屏?

想想看锁屏的操作逻辑,如果让你从无到有实现它,你会怎么做?

首先要在开屏时及时的显示出来,那么可以在关屏后就让锁屏准备好。

其次是在锁屏显示的时候,除非 App 要求显示在锁屏之上,否则一律不允许显示在锁屏之上。

消除锁屏时,需判断当前是否需要输入密码或图案,必须通过验证才能消除锁屏。

以上还不算顶部栏信号和电量的显示,时间日期的显示,通知的显示,以及底部的电话按钮和拍照按钮。

常规能想到的做法是,配合系统,在系统关屏的时候,将锁屏显示出来,此时屏幕是黑的也看不到锁屏,直到开屏后,锁屏就在那等着了。

接下来我们看下 SystemUI 是怎么实现锁屏的。

分析锁屏的视图控件树

对于有 UI 的东西,选择 UI 作为突破口是个不错的选择,先在设置中把屏幕锁定的方式改成“滑动”,然后关闭屏幕,再开启屏幕,锁屏就显示出来了。

这里选择哪个 Window 呢?很明显不是 NavigationBar 和 RecentsActivity,其他的都试试,就会发现在 StatusBar 里面。

97065d1732a8f37f639fb6adca50e06a.png

图中锁屏的浅蓝色遮罩是我加上去的,可以看到锁屏的控件树是放在 StatusBar 中的,也很容易理解,因为锁屏需要显示通知栏,放在 StatusBar 中可以复用。

搜索最顶级的 Layout:StatusBarWindowView,是在 super_status_bar.xml 中被使用的,通过控件树和 xml 定义,可得到如下的控件树:

ce6434519821054d5ee0ff55728c5561.png

可知属于锁屏界面的有三大块:顶部的状态、中间的日期、底部的电话相机按钮。

锁屏的显示流程

知道了锁屏的相关控件,那么锁屏是怎么被显示出来的呢?我们可以选择一个 view 的显示和隐藏作为突破口来分析。

这里我们选择锁屏底部的按钮作为开始,在锁屏显示出来的


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部