- 浏览: 199578 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
xumin_minzi:
我也在使用ndk编译,ffmpeg源码放在哪个目录里面?
[原创]Android ndkr8编译 FFmpeg 0.11.1 "Happiness" -
ericchan2012:
在Dialog调用show方法之后
【原创】Android 设置Dialog的长宽和位置 -
maohualei:
求解: 我设置的时候 位置居然没有反应 dial ...
【原创】Android 设置Dialog的长宽和位置
解锁、锁屏界面状态改变、锁屏(开机锁屏、时间超时锁屏、按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失效
}
}
}
对于按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失效
}
}
}
对于按power键让系统锁屏的流程还没搞清楚,希望知道的同学留言告知。。
发表评论
-
Android锁屏的问题
2012-10-19 09:17 1307本文主要讨论Android锁屏的问题,具体有2个需求: 1、 ... -
android 修改开关机铃声
2012-10-18 16:52 18201,boot铃声,在surfaceflinger.cpp中re ... -
android输入法全屏问题
2012-10-18 15:18 1303两种方法: 一是在源码里进行修改。frameworks/bas ... -
android 从横屏到竖屏状态出现黑屏
2012-10-16 12:08 1773修改WindowManagerService.java中的pe ... -
android添加reboot选项
2012-10-13 15:33 14201,GlobalAction.java中mItems = Li ... -
手机硬件
2012-10-13 13:39 944转自http://bbs.meizu.com/thread-4 ... -
Android编译后的文件结构
2012-10-09 18:57 809Android编译完成后,将在根目录中生成一个out文件夹,所 ... -
framework下资源文件---自定义统一的系统风格
2012-09-26 17:46 11771.系统资源文件位置:framework/base/core/ ... -
Android系统默认值的设置
2012-09-26 09:25 11161开机图片: android-logo-mask.png ... -
android apk安装原理分析
2012-09-25 14:16 1703参考了网上的资料和源码,肤浅分析了下,不够深入。 An ... -
android 触屏反馈原理
2012-09-25 14:13 1749android中触屏反馈原理 HOPE mt6516 a ... -
Android下的系统Intent大全
2012-08-23 08:58 9121.从google搜索内容 Intent intent = n ... -
修改Android framework定制重启功能
2012-08-15 15:08 4193涉及到的源码(4.0) ics/frameworks/base ... -
Android makefile mk 重要参数解释及 通用模板编写
2012-08-10 09:04 16871. LOCAL_MODULE_TAGS解释: 控制此模块在什 ... -
手机的AP和BP是什么?
2012-08-06 15:56 1346手机的AP和BP根据上下文可以指代硬件和软件两种意思. 1) ... -
Android 上层界面到内核代码的完整的流程分析,以alarm为例子
2012-07-31 17:15 1281Alarm 调用流程,alarm的流程实现了从上层应用一直到下 ... -
彩信APN切换流程(framework)
2012-07-31 15:46 2012TransactionService之前的流程比较简单不在赘 ... -
我架设的程序员问答网站
2012-06-12 18:20 1123我架设了一个程序员问答网站,欢迎来http://program ... -
Android编译系统三
2012-06-15 10:33 1090android编译系统的makefile文件Android.m ... -
Android编译系统二
2012-06-08 14:46 2661一,Android编 译系统结构 android的编译文件 ...
相关推荐
本文档主要讲解锁屏的启动流程,锁屏的灭屏上锁,锁屏的亮屏解锁逻辑。 此文档适合SystemUI的初学者,能让SystemUI初学者立刻马上接手SystemUI锁屏模块。 有助于SytemUI锁屏的开发。 SystemUI锁屏初学者 SytemUI...
Android待机流程分析---锁屏、解锁模块源码分析+流程分析图
android一键锁屏源码,强调了一些常见的问题
Android自定义锁屏实现----仿正点闹钟滑屏解锁
该软件不同于常见的触摸控制的解锁...该软件锁屏解锁功能可根据个人喜好自主设置。 该软件通过光线感应器来控制屏幕的锁定与解锁,所以手机必须要具备光线感应器才能使用这款软件。 请安装前认真阅读readme文件的要求。
android 滑动解锁实现源代码.zip Android4.2原生锁屏GlowPadView.zip Android滑动解锁.zip android一键锁屏源代码,android4.2工作正常.zip 安卓锁屏和恢复出厂设置功能.rar 按下电源键,再次按下时,弹出自定义界面...
android一键锁屏源代码,android4.2工作正常.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
主要是模仿android端九宫格锁屏解锁功能。简单的实现更换解锁密码,以及保存解锁密码
Android 锁屏页面避免被杀掉,解锁会自动关闭页面。防止后台运行时被关闭。 谷歌,小米,华为 亲测可用。 重点解决魅族手机,需要授权应用获得锁屏页面权限。
基本的锁屏功能 可以屏蔽掉home键等等,可参考
Android 监听Home键、锁屏、解屏处理方法,都有注释。使用简介: (1)、将内部类(广播类)作为MyBroadcastReceiver类的成员变量,方便activity使用 (2)、对外接口类(如:ScreenStateListener)作为...
主要是利用距离传感器实现的android的自动锁屏与解锁
在分析指纹解锁之前我们需要分析SystemUI如何实现指纹监听的, 本文档从源码角度分析指纹解锁的流程.对指纹解锁进行一定程度的分析
android指纹锁屏+九宫锁屏,很不错的android应用
主要介绍了Android 监听锁屏、解锁、开屏 功能代码的相关资料,需要的朋友可以参考下
知识点: * 自定义View、View事件分发机制、接口通信 * 总结:http://blog.csdn.net/Vicent_9920/article/details/53308040
U盘解锁/锁屏,朋友说教室的电子白板,课间会有学生到讲台搞,于是设置了密码,然后将密码发给各科老师, ... 于是我弄了这个小软件。开始想着弄成检测U盘必须要有某个指定内容的...插入U盘自动解锁,拔掉U盘自动锁屏。
拯救电源键】最详尽的android开发一键锁屏实例 源码.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
【Android】精美锁屏效果(滑动解锁)
android版背单词锁屏,简单的功能,可以提升您的英语水平。