修改Android解锁界面

本文介绍了从WinCE转到Android后,修改Android原生解锁界面的任务。详细讲解了Android锁屏的相关代码路径,重点分析了锁屏界面的显示、隐藏、重置等逻辑,以及如何自定义解锁效果,包括解锁界面的布局、控件选择和响应事件处理。通过样机展示了将解锁图标替换为最近运行应用图标的功能,涉及Android4.0之后的波纹解锁实现,并探讨了如何获取最近运行任务的图标并启动相应Activity。
摘要由CSDN通过智能技术生成

背景  
 
   先说说背景吧,这是本人从WinCE系统转到Android之后,接到的第一个任务就是修改Android原生的解锁界面,之前看了两个星期的书和网络博客,Java的也有、Android应用开发的也有、Linux开发的也有、Android框架介绍的也有。然后写了几个APK试了了一下,觉得自己有能力了,便充满自信地找到组长接任务。组长没有说什么,拿出一个竞争对手公司的样机,玩了几下拿个我,说道:这是竞争对手公司的方案,他们的解锁效果不错,很方便,你看看能不能也做出来。
   说实话接到这个任务当时真的有点失望,心里面一直想,当初做WinCE做的几乎全是驱动,整天和寄存器、指针、协议打交道,现在转到Android,做这些应用的东西真的不太习惯。不过转头一想,不管什么东西,要做就要做好,慢慢来嘛,于是拿走样机回到工位上,安心开始研究。
   样机解锁界面效果类似如下

  其实这也是我后面做出的效果,样机因为没有ROOT不好调试截图,功能是将解锁的图标添加了最近运行的运用的图标,这样的话更方便用户去使用

1.分析 

1.1.
Android
锁屏功能分析

Android锁屏相关的代码在以下几个路径:

锁屏的具体实现:

 

\frameworks\base\policy\src\com\android\internal\policy\impl

其中的主要代码如下:

锁屏控件的View

\frameworks\base\core\java\com\android\internal\widget\multiwaveview

锁屏控件使用到的资源

\frameworks\base\core\res\res\values-sw600dp-land\arrays.xml

\frameworks\base\core\res\res\drawableXXX

Android上常用的锁屏方法有以下几种:默认锁屏方式(LockScreen)、SIM卡解锁方式(SimUnlockScreen)、图案解锁方式(PatternUnlockScreen)、密码解锁方式(PasswordUnlockScreen)、账号解锁方式(AccountUnlockScreen),这些解锁方式都有对应的源码实现,我们这里讨论的是最常用的默认解锁方式,在Android4.0之后,解锁控件变为“波纹解锁”,即如概述介绍的那样,通过控制中心的圆圈来实现解锁,这种解锁方式,实际上可以进一步增强。

1.1.1.  Android 启动后从窗口管理器运行到解锁界面的动作

1.开机启动后执行到PhoneWindowManager.systemReady()

2.调用KeyguardViewMediator.onSystemReady()进行待机锁屏及解锁逻辑。

3.KeyguardViewMediator是整个待机解锁屏业务的调度器,负责调度锁屏界面的相关动作及查询解锁屏状态。

1.1.2.  KeyguardViewMediator的作用

1.查询锁屏状态,及当前处于锁屏状态还是已解锁状态,PhoneWindowManager持有KeyguardViewMediator的引用,当用户触摸屏幕或者按下某个键是,PhoneWindowManager会通过KeyguardViewMediator查询锁屏状态(锁定/解锁),进行不同的响应处理。如果处于锁定状态,系统输入事件会受到限制。

2.响应电源事件(黑/亮屏)。判断锁屏界面应该处于什么状态(显示或者重置)。手机黑屏后,锁屏界面马上就会显示出来,以便下一次亮屏后,马上就能显示锁屏界面,而不会出现闪烁或延时。

3.其他应用程序或者服务也可以请求禁止锁屏(通过调用KeyguardViewMediatorsetKeyguardEnabled(boolean)方法)。例如接听来电界面。

KeyguardViewMediator类在WindowManagerPolicy(在手机系统中是PhoneWindowManager实例)初始化时被创建,并运行在它的线程上,锁屏的UI界面也是在这个线程上创建及显示的。KeyguardViewMediator类提供的状态查询api可以被诸如android.view.WindowManagercom.android.server.InputManager等其它线程调用,所以,KeyguardViewMediator类上的这些api方法都是线程同步的(synchronized)。

1.1.3.  KeyguardViewMediator可以进行的调度操作

1) 点亮屏幕pokeWakelock();

2) 报告锁屏权限验证是否成功keyguardDone(boolean);

3) 响应SIM卡状态变化并对锁屏界面做相应的调整onSimStateChanged()。

4) 调度待机锁屏UI界面的管理,包括:

1.显示handleShow ()

2.隐藏handleHide ()

3.重置handleReset ()

4.点亮屏幕handleWakeWhenReady()等。

KeyguardViewMediator实现这部分调度是通过持有一个KeyguardViewManager来实现的。总之KeyguardUpdateMonitor是所有会影响整个待机解/锁屏业务的事件的监控器。(除了作为监控器,它还发挥着类似上下文的作用,也许我们应该把这个类命名为(KeyguardContext)。它监控诸如时间改变、电池状态改变、时区改变、SIM卡状态变化、电话状态变化、电话信号变化等事件。它是一个观察者模式的被观察对象。观察者通过调用KeyguardUpdateMonitor的以下方法进行注册,观察自己感兴趣的变化。

registerInfoCallback(InfoCallback)registerSimStateCallback(SimStateCallback)

 

    KeyguardUpdateMonitor的观察者包括KeyguardViewMediatorLockScreenPatternUnlockScreenAccountUnlockScreenPasswordUnlockScreenSimUnlockScreen等。观察者通过调用KeyguardUpdateMonitorremoveCallback(Object)取消观察。

KeyguardViewManager负责管理待机屏UI界面的创建、显示、隐藏、重置以及通过一个回调KeyguardViewCallback通知调度器KeyguardViewMediator进行相关的调度。

LockPatternKeyguardViewKeyguardViewBase)是所有锁屏和解锁UI界面的宿主。它有2个模式Mode. LockScreenMode. UnlockScreen。它负责根据当前上下文环境切换当前应该显示的待机屏。

它提供一个回调给当前显示的待机屏并处理其回调,如果回调动作是自己处理不了的,则继续报告给KeyguardViewMediator进行处理。

锁屏界面就是LockScreen;解锁界面包括SIM卡解锁SimUnlockScreen、图案解锁PatternUnlockScreen、密码解锁PasswordUnlockScreen、帐号解锁AccountUnlockScreen

解锁成功后,锁屏流程转到KeyguardViewMediatorkeyguardDone(boolean, boolean) 进行后续的流程(如转到Launcher桌面)。

1.2. 解锁界面布局

解锁界面布局在LockScreen类的构造函数中进行,LockScreen构造函数内容如下:

点击(此处)折叠或打开

  1. LockScreen(Context context, Configuration configuration, LockPatternUtils lockPatternUtils,
  2.             KeyguardUpdateMonitor updateMonitor,
  3.             KeyguardScreenCallback callback) {
  4.         super(context);
  5.         mLockPatternUtils = lockPatternUtils;
  6.         mUpdateMonitor = updateMonitor;
  7.         mCallback = callback;

  8.         mEnableMenuKeyInLockScreen = shouldEnableMenuKey();

  9.         mCreationOrientation = configuration.orientation;

  10.         mKeyboardHidden = configuration.hardKeyboardHidden;

  11.         if (LockPatternKeyguardView.DEBUG_CONFIGURATION) {
  12.             Log.v(TAG, "***** CREATING LOCK SCREEN", new RuntimeException());
  13.             Log.v(TAG, "Cur orient=" + mCreationOrientation
  14.                     + " res orient=" + context.getResources().getConfiguration().orientation);
  15.         }

  16.         final LayoutInflater inflater = LayoutInflater.from(context);
  17.         if (DBG) Log.v(TAG, "Creation orientation = " + mCreationOrientation);
  18.         if (mCreationOrientation != Configuration.ORIENTATION_LANDSCAPE) {
  19.             inflater.inflate(R.layout.keyguard_screen_tab_unlock, this, true);
  20.         } else {
  21.             inflater.inflate(R.layout.keyguard_screen_tab_unlock_land, this, true);
  22.         }

  23.         mStatusViewManager = new KeyguardStatusViewManager(this, mUpdateMonitor, mLockPatternUtils,
  24.                 mCallback, false);

  25.         setFocusable(true);
  26.         setFocusableInTouchMode(true);
  27.         setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);

  28.         mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
  29.         mSilentMode = isSilentMode()
  • 0
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值