一、主要思路

1.       使用GridView控件实现上图下文显示,实现锁屏缩略图预览效果

2.       从数据系统settings.db数据库中读取锁屏类型数据

3.       使用图片合成来显示图片选中效果

具体效果如图:

android锁屏架构 android锁屏壁纸_初始化

二、资源存放

图片:锁屏样式预览缩略图存放在drawable资源中

数据:主要读取settings.db数据库中的System表

三、重要数据说明

整型数组previewImage存放图片资源ID

整型数组lockstyle_nameid存放锁屏类型字符串

图片数组previewBitmap存放预览图片

图片数组previewSelectBitmap存放预览选中图片

字符串数组lockType存放setting.db数据库表中的字段名称

ArrayList<HashMap<String, Object>> listItems 是个数组列表,其列表项是个HashMap,每一个HashMap中保存两个重要数据项:需要显示的图片,以及与该图片对应的字符串。

四、重要方法说明

initData()

主要功能:初始化数据。初始化原始预览图片数组,初始化选中效果图片数组,初始化ArrayList数组列表,从数据库中获取当前选中项。

Doodle(Bitmap src, Bitmap watermark)

主要功能:将原始预览图片和选中效果图合并,返回最终的选中效果图。

参数:src:原始图片

     Watermark:需要合并到原始图片上的图片

返回值:最终合成图Bitmap

initSelectState()

主要功能:将当前选中项的数据更新为选中效果的数据。

saveSetting()

主要功能:保存设置到数据库system

getSetting()

主要功能:从数据库system中获取设置

saveSecureSetting()

主要功能:保存设置到数据库Secure

getSecureSettings()

主要功能:从数据库Secure中获取设置

五、系统框图

系统框图

android锁屏架构 android锁屏壁纸_android锁屏架构_02


六、总结

最常见的是Android解屏的界面,然后应该是Home界面。通常 Android手机上大家常见的界面只有一种,成功后即可解锁进入界面了。其实在Android手机中,正常的锁屏界面由两种不同性质的界面组成:

第一种界面称之为LockScreen界面

首先他是上锁后是怎么调用到LockScreen这个这里面的呢,其实LockScreen.Java是一个layout的文件,通过LockPatternKeyguardView类的切换来实现。

SlidingTab.java分析:

分析我们的Touch在 SlidingTab 上产生的效果,主要看onTouchEvent()的处理。

ACTION_DOWN 时会调用disableButtonPress(),产生手指点击时的动画效果。

ACTION_MOVE 时会调用moveControl()产生图片跟随手指移动的效果。

ACTION_UP  时会判断移动的位置是否已经到了,可以触发Trigger的程度,如果到了,则调用   dispatchTriggerEvent,通知在 SlidingTab上的TriggerListener。由于 SlidingTab上的 Trigger Listener是在  LockScreen里实现的,所以会代用到 LockScreen中。

LockScreen.java分析:

代码中有一行:privateSlidingTab mSelector; 将SlidingTab作为它的一个属性值,

另外此类实现了SlidingTab.OnTriggerListener。这个listener用来执行我们从左到右或者从右到左的滑动,在构造函数中有mSelector.setOnTriggerListener(this);这样我们在SlidingTab上的滑动会调用到publicvoid onTrigger(View v, int whichHandle)方法中。

onTrigger的执行为两个分支,一个为从右滑向左,执行了mAudioManager.setRingerMode(),设置了声音的模式,并更新右边声音的图片。另一个为从左滑向右,执行的是mCallback.goToUnlockScreen();这个mCallback是何方神圣呢?它是KeyguardScreenCallback类型,并且在LockScreen初始化的时候传进来的,跟踪后我们发现,LockScreen是类LockPatternKeyguardView的一个属性值(private View mLockScreen);KeyguardScreenCallback的实现在LockPatternKeyguardView中。

LockPatternKeyguardView中LockPatternKeyguardView的逻辑是,如果用户在设置->位置和安全 ->设置屏幕锁定中设置了解锁画面,则调用了updateScreen(Mode.UnlockScreen)进入相应的解锁画面,否则调用:getCallback().keyguardDone(true); 这个getCallback() 返回的是KeyguardViewMediator。

KeyguardViewMediator 中 keyguardDone()方法,最终会给Handler发送KEYGUARD_DONE 的消息,Handler会执行handleKeyguardDone()方法,在方法中会调用handleHide(),这个函数会将我们的LockScreen给隐藏。

总结:总体来说,上面提到的类基本上可以这么认为,SlidingTab属于LockScreen,LockScreen属于 LockPatternKeyguardView, LockPatternKeyguardView 属于KeyguardViewManager,KeyguardViewManager来统管所有与锁解屏相关的操作,另外通过 KeyguardViewMediator,来实现KeyguardViewManager和PhoneWindowManager之间的交互与通信。

画面的更新实现

画面更新是由com.Android.internal.policy.impl.KeyguardUpdateMonitor来实现的。它注册锁屏Receive 用于接受各种Intent(例如:时间,电池,Sim状态,电话状态),来处理Lock界面上的信息的更新。

 第二种界面称之为UnLockScreen,有以下几种:

1、  图案开锁界面

2、  PIN开锁界面

3、  密码开锁界面


七、锁屏时序图

android锁屏架构 android锁屏壁纸_初始化_03