解锁、锁屏界面状态改变、锁屏(开机锁屏、时间超时锁屏、按power键锁屏)  一、解锁。以划动解锁(LockScreen.java)为例     1、划动解锁触发其控件监听方法onTrigger,onTrigger方法再调用对象mCallback.goToUnlockScreen()         2、在LockPatternKeyguardView的构造函里创建一个KeyguardScreenCallback的对象mKeyguardScreenCallback,并实现KeyguardScreenCallback的所有抽象方法。            LockPatternKeyguardView把mKeyguardScreenCallback当作LockScreen的构造函数的参数,LockScreen把该参数赋值给mCallback,所以mCallback==mKeyguardScreenCallback            3、KeyguardScreenCallback的抽象方法goToUnlockScreen的具体实现是:getCallback().keyguardDone(false)            KeyguardViewMediator当作KeyguardViewManager的构造函数的参数传给KeyguardViewManager,               然后在创建LockPatternKeyguardView对象mKeyguardView(mKeyguardView = mKeyguardViewProperties.createKeyguardView(mContext, mUpdateMonitor, this))后,               执行mKeyguardView.setCallback(mCallback);               所以getCallback().keyguardDone(false)==KeyguardViewMediator.keyguardDone(false)            4、KeyguardViewMediator.keyguardDone(false)通过传递消息ID(KEYGUARD_DONE),最终调用KeyguardViewManager.hide()方法把界面给View.setVisibility(View.GONE)方法把界面隐藏,        并清除。之后进入到launcher界面。  二、锁屏界面状态改变。以LockScreen界面的时间变化举例      LockScreen是view类型,并实现接口 KeyguardUpdateMonitor.InfoCallback的onTimeChanged()方法。           在LockScreen的构造函数里面通过执行updateMonitor.registerInfoCallback(this)把LockScreen注册到KeyguardUpdateMonitor的观察对象列表。           KeyguardUpdateMonitor注册了一个BroadcastReceiver用于监听时间、信号、电量等界面信息的变化。当时间发生变化时,BroadcastReceiver接收到Intent.ACTION_TIME_CHANGED,           之后发出消息MSG_TIME_UPDATE。Handler接收到MSG_TIME_UPDATE后执行handleTimeUpdate(),在handleTimeUpdate里面代码如下:           for (int i = 0; i < mInfoCallbacks.size(); i++) {         mInfoCallbacks.get(i).onTimeChanged();       }循环调用观察对象的onTimeChanged方法。        三、锁屏(开机锁屏、时间超时锁屏、按power键锁屏)      A、开机锁屏             当系统初始化完成后会调用wm(WindowManagerService.java).systemReady()函数,触发解锁界面。               --->PhoneWindowManager.systemReady()--->mKeyguardMediator(KeyguardViewMediator.java).onSystemReady()               -->mKeyguardMediator.doKeyguard()-->mKeyguardMediator.showLocked(){Message msg = mHandler.obtainMessage(Show)  mHandler.sendMessage(msg)}               -->mKeyguardMediator.handleShow()-->mKeyguardViewManager(KeyguardViewManager.java).show()        {创建锁屏界面类mKeyguardView = mKeyguardViewProperties.createKeyguardView(mContext, mUpdateMonitor, this),之后执行mKeyguardHost.addView(mKeyguardView, lp)就可以显示界面了}            B、时间超时锁屏           当PowerManagerService.java服务建立起来后,电源的状态循环则主要是通过Handler来实现的。               PowerManagerService在初始化方法里面会启动mHandler消息循环来提供任务的延迟发送,通过mHandler.post(TimeoutTask.java,int delaytime)实现timeout机制。        注:TimeoutTask.java是PowerManagerService.java的一个内部类,用于timeout控制。              1、PowerManagerService.userActivity()里面在调用setPowerState之后会用setTimeoutLocked来设置timeout。               然后在setTimeoutLocked里面会根据当前的状态来计算下一个状态以及时间,判断完再调用mHandler.postAtTime(mTimeoutTask, when)来post一个TimeoutTask。        这样在when毫秒后就会执行TimeoutTask。               在TimeoutTask里面则根据设定的状态来调用setPowerState来改变电源状态,然后再设定新的状态,               比如现在是把屏幕从亮改暗了,那就再用setTimeoutLocked(now, SCREEN_OFF)来等下把屏幕完全关掉。如果这次已经是把屏幕关了,那这轮的timeout状态循环就算是结束了。             2、在PowerManagerService.userActivity()方法的最后面执行 mPolicy.userActivity()===PhoneWindowManager.userActivity(),其代码如下:         if (mLockScreenTimerActive) {          // reset the timer          mHandler.removeCallbacks(mScreenLockTimeout);          mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout);         }                 mLockScreenTimeout是settings里设置的屏幕超时时间,mScreenLockTimeout是一个runable,代码如下:         Runnable mScreenLockTimeout = new Runnable() {          public void run() {              synchronized (this) {                  if (localLOGV) Log.v(TAG, "mScreenLockTimeout activating keyguard");                  mKeyguardMediator.doKeyguardTimeout();                  mLockScreenTimerActive = false;              }          }         };mKeyguardMediator.doKeyguardTimeout()是下发锁屏命令。             总的来说,就是在用户活动例如点击触摸屏之后,通过执行PowerManagerService.userActivity()重新设置系统的电源状态之后,        再通过执行mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout)设置在mLockScreenTimeout之后屏幕锁屏             C、按power键锁屏       WindowManagerService负责android系统显示的加载及事件的接收和分发。       power键是一个比较特殊的按键,power键的所有相关动作在WindowManagerService的内部类KeyQ的预处理方法preprocessEvent()截获,并且不会把事件放到KeyQ的事件列表中去       大致流程如下:       preprocessEvent()-->mPowerManager.goToSleep(event.when){PowerManagerService.goToSleep(long time)}--->PowerManagerService.goToSleepWithReason(time, WindowManagerPolicy.OFF_BECAUSE_OF_USER)             --->PowerManagerService.goToSleepLocked(long time, int reason)-->PowerManagerService.setPowerState(SCREEN_OFF, false, reason)             --->PowerManagerService.sendNotificationLocked(true, -1)--->mHandler.post(mNotificationTask)--->policy.screenTurnedOff(why)       policy即是PhoneWindowManager.java,接下去就会再去调用dokeyguard等方法进行锁屏             总的来说就是WindowManagerService截获power事件,在preprocessEvent()预处理方法里通知PowerManagerService暗下去,在PowerManagerService在屏幕暗下去的过程中调用       PhoneWindowManager去再创建锁屏界面       注:在因power键创建锁屏的过程中,PhoneWindowManager会去把mScreenLockTimeout从消息对列中去掉,以免冲突代码如下:      private void updateLockScreenTimeout() {          synchronized (mScreenLockTimeout) {                          Log.d("cai","6666666666666666666-------");              boolean enable = (mAllowLockscreenWhenOn && mScreenOn && mKeyguardMediator.isSecure());              if (mLockScreenTimerActive != enable) {                  if (enable) {                      if (localLOGV) Log.v(TAG, "setting lockscreen timer");                      mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout);                  } else {                      if (true) Log.v("cai", "clearing lockscreen timer");                      mHandler.removeCallbacks(mScreenLockTimeout);//把mScreenLockTimeout从消息对列中去掉                  }                  mLockScreenTimerActive = enable;//设置屏幕超时的timer失效              }          }      }

android锁屏流程_android 解锁,锁屏流程相关推荐

  1. android锁屏流程_Android开机锁屏流程分析

    Android开机锁屏流程: 首先:手机开机时,在SystemServer类的init2()方法中会启动线程类ServerThread的run方法如下: WindowMan Android开机锁屏流程 ...

  2. android分屏模式_Android的分屏模式开发注意事项

    android7.0 的API开始有了分屏功能,在测试时注意到主页面在分屏模式下,页面所占比例在增大或者减小的时候都会调用oncreat方法,所以查资料总结一下分屏对页面的生命周期的影响以及开发时的注 ...

  3. android 滑动取值_Android中滑屏实现

    前言:  虽然本文标题的有点标题党的感觉,但无论如何,通过这篇文章的学习以及你自己的实践认知,写个简单的滑屏小 Demo还是justso so的. 友情提示: 在继续往下面读之前,希望您对以下知识点有 ...

  4. canvas画布会黑屏吗_Android SurfaceView 黑屏问题

    说一个真实的案例.其中需求要做一个绘图功能,一听到绘图,自然而然就像到了SurfaceView这个类.所以我就用了. android:layout_width="match_parent&q ...

  5. 左右滑屏设置_android手势滑屏及左右滑屏

    ViewFlipper的使用(手势滑屏) 屏幕切换指的是在同一个Activity内屏幕见的切换,最长见的情况就是在一个FrameLayout内有多个页面,比如一个系统设置页面:一个个性化设置页面. 通 ...

  6. webview 禁用横竖屏切换_Android 禁止横竖屏切换

    MainActivity里面的代码: public void onConfigurationChanged(Configuration newConfig) { try { super.onConfi ...

  7. Android 9.0 10.0 锁屏滑动滑动解锁不灵

    系统默认锁屏需要滑动才能解锁,但是在一些大屏,滑动解锁确有问题,通常是滑动距离设置的过大导致解不了锁 解决方案: 修改系统默认滑动解锁的值,来方便滑动解锁 首选看源码 PanelView.java 这 ...

  8. android 8.0 3D锁屏,Android 8.0 锁屏滑动无法解锁

    问题:有一个电阻屏的手机,屏幕小,并且滑动不流畅导致无法解锁 解锁有两个界面 1. Notification Keyguard 显示通知锁屏 2.bouncer输入密码锁屏 一般情况下解锁根据滑动Y距 ...

  9. android手机禁止休眠_Android的屏幕禁止休眠和锁屏的方法

    Android的屏幕禁止休眠和锁屏的方法 Android的屏幕禁止休眠的方法 .实现这一功能的方法有两种,一种是在的Manifest.xml文件里面声明,一种是在代码里面修改的LayoutParams ...

最新文章

  1. table合并单元格colspan和rowspan
  2. matlab如何点对点画曲线,MIMOBeamformingExample
  3. C++ auto 关键字的使用
  4. 鸿蒙系统安装过程中出错,求助求助——鸿蒙系统Windows环境搭建时hpm安装失败!!!...
  5. 批处理系统和分时系统各具有什么特点?为什么分时系统的响应比较快?
  6. mysql 设置事物自动提交_mysql事务自动提交的问题
  7. 七牛云 转码_七牛云存储 - 七牛 php sdk 上传 转码 问题
  8. X5045的C语言源码,X5045看门狗的单片机源程序和Proteus仿真原理图
  9. 参加2015年TOP100会议的零散笔记
  10. js window对象常用内容
  11. SQL Server 2012 读写分离设置
  12. vnc远程桌面精灵,七款让人爱不释手的vnc远程桌面精灵
  13. No qualifying bean of type ‘com.dao.BookDao‘ available解决
  14. XMPP 客户端和服务端
  15. 硬币找钱问题(最小硬币和问题)详解与代码实现
  16. one class classification
  17. 微信公众帐号开发教程第8篇-QQ表情的发送与接收
  18. ToLua 入门05_AccessingLuaVariables
  19. 前端HTML CSS JavaScipt JQuery
  20. python中使用tomorrow多线程时报错invalid syntax

热门文章

  1. Vehicle Re-Identification 调研 and数据集(未)
  2. Python使用scapy和dpkt抓包并解析
  3. 采用OLS估计进行VAR模型估计代码
  4. Kindle免费在线文档存储及格式转换服务
  5. 电磁波空间传播损耗公式
  6. 封装一个layui组件---js实现数字翻牌器效果
  7. 将docx文档转为doc文档
  8. 硬盘无法格式化怎么解决?数据丢失怎么恢复?
  9. Java数据结构与算法(十三):程序员常用的10种算法
  10. 创意无限,国外PS神作【转载】