- 浏览: 205756 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
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 1348本文主要讨论Android锁屏的问题,具体有2个需求: 1、 ... -
android 修改开关机铃声
2012-10-18 16:52 18571,boot铃声,在surfaceflinger.cpp中re ... -
android输入法全屏问题
2012-10-18 15:18 1342两种方法: 一是在源码里进行修改。frameworks/bas ... -
android 从横屏到竖屏状态出现黑屏
2012-10-16 12:08 1836修改WindowManagerService.java中的pe ... -
android添加reboot选项
2012-10-13 15:33 14791,GlobalAction.java中mItems = Li ... -
手机硬件
2012-10-13 13:39 1000转自http://bbs.meizu.com/thread-4 ... -
Android编译后的文件结构
2012-10-09 18:57 851Android编译完成后,将在根目录中生成一个out文件夹,所 ... -
framework下资源文件---自定义统一的系统风格
2012-09-26 17:46 12191.系统资源文件位置:framework/base/core/ ... -
Android系统默认值的设置
2012-09-26 09:25 11601开机图片: android-logo-mask.png ... -
android apk安装原理分析
2012-09-25 14:16 1785参考了网上的资料和源码,肤浅分析了下,不够深入。 An ... -
android 触屏反馈原理
2012-09-25 14:13 1788android中触屏反馈原理 HOPE mt6516 a ... -
Android下的系统Intent大全
2012-08-23 08:58 9481.从google搜索内容 Intent intent = n ... -
修改Android framework定制重启功能
2012-08-15 15:08 4238涉及到的源码(4.0) ics/frameworks/base ... -
Android makefile mk 重要参数解释及 通用模板编写
2012-08-10 09:04 17321. LOCAL_MODULE_TAGS解释: 控制此模块在什 ... -
手机的AP和BP是什么?
2012-08-06 15:56 1391手机的AP和BP根据上下文可以指代硬件和软件两种意思. 1) ... -
Android 上层界面到内核代码的完整的流程分析,以alarm为例子
2012-07-31 17:15 1332Alarm 调用流程,alarm的流程实现了从上层应用一直到下 ... -
彩信APN切换流程(framework)
2012-07-31 15:46 2054TransactionService之前的流程比较简单不在赘 ... -
我架设的程序员问答网站
2012-06-12 18:20 1204我架设了一个程序员问答网站,欢迎来http://program ... -
Android编译系统三
2012-06-15 10:33 1145android编译系统的makefile文件Android.m ... -
Android编译系统二
2012-06-08 14:46 2773一,Android编 译系统结构 android的编译文件 ...
相关推荐
本文将深入探讨Android 10.0版本的锁屏启动流程,包括锁屏的启动、灭屏上锁以及亮屏解锁的逻辑。这对于SystemUI的初学者来说是非常有价值的学习内容,能帮助他们快速理解和掌握锁屏模块的开发。 首先,让我们从锁屏...
### Android待机流程分析——锁屏、解锁模块 在深入探讨Android系统中锁屏与解锁模块的工作原理之前,我们先来了解一下这些概念的基本背景。Android操作系统作为全球最广泛使用的移动设备操作系统之一,其用户界面...
在本文中,我们将从源码的角度深入探讨Android系统中指纹解锁的具体实现流程。首先,要了解指纹解锁,我们需了解SystemUI如何监听指纹操作。SystemUI是一个系统级应用,负责显示状态栏、导航栏等界面元素,是Android...
Android 监听Home键、锁屏、解屏处理方法,都有注释。使用简介: (1)、将内部类(广播类)作为MyBroadcastReceiver类的成员变量,方便activity使用 (2)、对外接口类(如:ScreenStateListener)作为...
2. 解锁流程 - 用户触发解锁操作(触摸屏幕或物理按键)。 - LockScreenActivity接收到事件,调用UnlockMethodHost的onUserActivity()方法。 - UnlockMethodHost根据当前设置的解锁方式,调用对应的UnlockMethod...
Android系统的开机启动流程涉及多个核心组件和服务,其中锁屏服务作为用户交互的第一道门槛,对于用户体验至关重要。本文将深入解析Android开机启动过程中的锁屏机制,重点探讨`PhoneWindowManager`与`...
首先,我们需要理解Android系统的启动流程。在Android中,锁屏应用通常作为系统服务运行,与系统其他组件进行交互。这种应用需要注册为一个BroadcastReceiver,以便在设备解锁或屏幕开启时接收相应的广播事件。 1. ...
Android九点锁屏是一种安全且有趣的手机锁定方式,它基于传统的九宫格解锁模式,让用户通过连接九个点中的特定顺序来解锁设备。这个系统增加了手机的安全性,因为相比于简单的数字或图案解锁,九点锁屏提供了更多的...
Android系统中的锁屏界面由多个组件构成,本文将深入分析Android锁屏与解屏相关的核心代码,尤其是索爱手机解锁界面的具体实现。 #### 二、锁屏界面组成与类结构 锁屏界面主要包括两部分:状态栏(Status Bar)与...
在Android系统中,实现“一键锁屏”功能主要涉及到设备管理器(Device Policy Manager, DPM)和系统服务的交互。下面将详细讲解这个过程,以及如何通过XML配置和权限控制来实现一键锁屏功能。 首先,理解Android的...
4. **系统级集成**:在Android中,锁屏涉及到系统的安全层,因此在自定义锁屏时,需要遵循特定的API和流程,以确保与系统的无缝集成。这可能包括注册BroadcastReceiver监听系统事件,或者通过IntentService在后台...
Android系统的待机流程是用户界面管理中的一个重要组成部分,它涉及到系统如何处理设备锁屏状态下的各种交互逻辑。在Android 2.2版本中,这一过程主要由`PhoneWindowManager`、`KeyguardViewMediator`等类来协同完成...
2. Keyguard锁屏流程: Keyguard的解锁流程相对复杂,涉及多个步骤。初次接触可能难以理解,但通过多次阅读源码,会逐渐清晰。流程图可以帮助我们理解这一过程,尽管初次接触可能会感到困惑,但随着对源码的深入,...
交互逻辑是智能UI锁屏的核心部分,涉及到解锁方式、快捷功能的触发和操作流程。常见的解锁方式有滑动、图案、数字密码、指纹或面部识别等。快捷功能如一键拨号、打开应用、启动相机等,需要设计简洁的操作路径,确保...
在Android平台上,手势锁屏是一种常见的安全功能,它允许用户通过特定的手势图案来解锁设备,增强了设备的安全性。本文将深入探讨如何实现一个基于距离传感器的手势锁屏功能,并结合源码分析其工作原理。 首先,...
在Android平台上,实现苹果风格的数字锁屏界面是一项有趣且具有挑战性的任务。这个项目旨在为Android设备提供与苹果iOS类似的锁屏体验,让用户能够通过输入预设的数字密码来解锁设备。以下是一些关键的知识点和实现...
以上是实现"android仿小米锁屏"的主要技术要点和流程。在实际开发中,我们还需要考虑到不同Android版本的兼容性、UI设计的美观性和一致性,以及用户体验的优化。通过熟练掌握这些知识点,可以打造出一个高质量的九宫...
标题中的“Android苹果锁屏”指的是一个Android应用项目,它实现了类似苹果iOS设备的锁屏界面功能。这个项目可能是为了帮助开发者学习如何在Android平台上创建具有iOS风格用户体验的应用,或者是作为一个自定义锁屏...
首先,我们需要理解Android系统的启动流程以及锁屏界面的角色。锁屏界面是用户与设备交互的第一道防线,它通常包含解锁机制,如滑动、PIN码或图案解锁。在这个案例中,我们关注的是图案解锁,也就是九宫格锁屏。 1....
在Android系统中,锁屏通知是一项重要的功能,它允许用户在不解锁设备的情况下查看和交互与应用程序相关的消息或提醒。本DEMO "android 锁屏通知小DEMO" 是一个简单的示例,用于演示如何在Android设备的锁屏界面上...