android锁屏流程_android 解锁,锁屏流程
解锁、锁屏界面状态改变、锁屏(开机锁屏、时间超时锁屏、按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 解锁,锁屏流程相关推荐
- android锁屏流程_Android开机锁屏流程分析
Android开机锁屏流程: 首先:手机开机时,在SystemServer类的init2()方法中会启动线程类ServerThread的run方法如下: WindowMan Android开机锁屏流程 ...
- android分屏模式_Android的分屏模式开发注意事项
android7.0 的API开始有了分屏功能,在测试时注意到主页面在分屏模式下,页面所占比例在增大或者减小的时候都会调用oncreat方法,所以查资料总结一下分屏对页面的生命周期的影响以及开发时的注 ...
- android 滑动取值_Android中滑屏实现
前言: 虽然本文标题的有点标题党的感觉,但无论如何,通过这篇文章的学习以及你自己的实践认知,写个简单的滑屏小 Demo还是justso so的. 友情提示: 在继续往下面读之前,希望您对以下知识点有 ...
- canvas画布会黑屏吗_Android SurfaceView 黑屏问题
说一个真实的案例.其中需求要做一个绘图功能,一听到绘图,自然而然就像到了SurfaceView这个类.所以我就用了. android:layout_width="match_parent&q ...
- 左右滑屏设置_android手势滑屏及左右滑屏
ViewFlipper的使用(手势滑屏) 屏幕切换指的是在同一个Activity内屏幕见的切换,最长见的情况就是在一个FrameLayout内有多个页面,比如一个系统设置页面:一个个性化设置页面. 通 ...
- webview 禁用横竖屏切换_Android 禁止横竖屏切换
MainActivity里面的代码: public void onConfigurationChanged(Configuration newConfig) { try { super.onConfi ...
- Android 9.0 10.0 锁屏滑动滑动解锁不灵
系统默认锁屏需要滑动才能解锁,但是在一些大屏,滑动解锁确有问题,通常是滑动距离设置的过大导致解不了锁 解决方案: 修改系统默认滑动解锁的值,来方便滑动解锁 首选看源码 PanelView.java 这 ...
- android 8.0 3D锁屏,Android 8.0 锁屏滑动无法解锁
问题:有一个电阻屏的手机,屏幕小,并且滑动不流畅导致无法解锁 解锁有两个界面 1. Notification Keyguard 显示通知锁屏 2.bouncer输入密码锁屏 一般情况下解锁根据滑动Y距 ...
- android手机禁止休眠_Android的屏幕禁止休眠和锁屏的方法
Android的屏幕禁止休眠和锁屏的方法 Android的屏幕禁止休眠的方法 .实现这一功能的方法有两种,一种是在的Manifest.xml文件里面声明,一种是在代码里面修改的LayoutParams ...
最新文章
- table合并单元格colspan和rowspan
- matlab如何点对点画曲线,MIMOBeamformingExample
- C++ auto 关键字的使用
- 鸿蒙系统安装过程中出错,求助求助——鸿蒙系统Windows环境搭建时hpm安装失败!!!...
- 批处理系统和分时系统各具有什么特点?为什么分时系统的响应比较快?
- mysql 设置事物自动提交_mysql事务自动提交的问题
- 七牛云 转码_七牛云存储 - 七牛 php sdk 上传 转码 问题
- X5045的C语言源码,X5045看门狗的单片机源程序和Proteus仿真原理图
- 参加2015年TOP100会议的零散笔记
- js window对象常用内容
- SQL Server 2012 读写分离设置
- vnc远程桌面精灵,七款让人爱不释手的vnc远程桌面精灵
- No qualifying bean of type ‘com.dao.BookDao‘ available解决
- XMPP 客户端和服务端
- 硬币找钱问题(最小硬币和问题)详解与代码实现
- one class classification
- 微信公众帐号开发教程第8篇-QQ表情的发送与接收
- ToLua 入门05_AccessingLuaVariables
- 前端HTML CSS JavaScipt JQuery
- python中使用tomorrow多线程时报错invalid syntax