Android44 42keyguard锁屏流程梳理.docx
- 文档编号:723280
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:22
- 大小:154.40KB
Android44 42keyguard锁屏流程梳理.docx
《Android44 42keyguard锁屏流程梳理.docx》由会员分享,可在线阅读,更多相关《Android44 42keyguard锁屏流程梳理.docx(22页珍藏版)》请在冰点文库上搜索。
Android4442keyguard锁屏流程梳理
Android4.44.2keyguard锁屏流程梳理
目录(?
)[-]
1文件目录
1a锁屏代理是在Frameworksbasepolicysrccomandroidinternalpolicyimplkeyguard下
1b整个工程应用在frameworkpackage下结构和功能现在都和systemUI类似
1ckeyguard的对外接口FrameworksbasecorejavaandroidappkeyguardManagerjava
2Keyguard锁屏流程图
3Keyguard锁屏view层次图
4Keyguard锁屏重要类分析
4PhoneWindowManagerjava
4KeyguardServiceDelegatejava和KeyguardServiceWrapperjava
4keyguardServicejava
4KeyguardViewMediatorjava
4KeyguardViewManagerjava
4KeyguardHostVIewjava
4KeyguardUpdateMonitorjava
谷歌android升到4.4,发现锁屏有很大变化,可以左右滑页,添加删除widget,添加删除分页。
简直就是一个简化版的launcher。
在android4.4中这个模块的改动简直是巨大,这里略作整理。
1.文件目录:
a,锁屏代理是在Frameworks/base/policy/src/com/android/internal/policy/impl/keyguard下:
b,整个工程应用在framework/package下,结构和功能现在都和systemUI类似:
c,keyguard的对外接口Frameworks/base/core/java/android/app/keyguardManager.java:
android4.2前做一些第三方锁屏软件都会用到该服务接口来控制系统锁屏(比如禁止系统锁屏),现在该接口已经不建议使用了,有更好的做法:
5/**
6*@deprecated使用{@linkandroid.view.WindowManager.LayoutParams#FLAG_DISMISS_KEYGUARD}
7*and/or{@linkandroid.view.WindowManager.LayoutParams#FLAG_SHOW_WHEN_LOCKED}
8*来代替;利用该方式可以使应用达到禁用锁屏的效果而不需要额外的权限申请。
thisallowsyouto
9*Enablesyoutolockorunlockthekeyboard.Getaninstanceofthisclassby
10*calling{@linkandroid.content.Context#getSystemService(java.lang.String)Context.getSystemService()}.
11*Thisclassiswrappedby{@linkandroid.app.KeyguardManagerKeyguardManager}.
12*@paramtagAtagthatinformallyidentifieswhoyouare(fordebuggingwho
13*isdisablinghekeyguard).
14*
15*@returnA{@linkKeyguardLock}handletousetodisableandreenablethe
16*keyguard.
17*/
18@Deprecated
19publicKeyguardLocknewKeyguardLock(Stringtag){
20returnnewKeyguardLock(tag);
21}
Keyguard锁屏流程图
Keyguard锁屏view层次图:
Keyguard锁屏重要类分析:
1.PhoneWindowManager.java
这个类很厉害也很重要,它由WindowManagerService派生,处理了phone的顶层逻辑,主要有以下几块:
a)横竖屏处理(屏幕旋转等)
22publicvoidsetCurrentOrientationLw(intnewOrientation){
23synchronized(mLock){
24if(newOrientation!
=mCurrentAppOrientation){
25mCurrentAppOrientation=newOrientation;
26updateOrientationListenerLp();
27}
28}
29}
b)是否显示状态条或者navigation_bar。
30privateintupdateSystemUiVisibilityLw(){
31//Ifthereisnowindowfocused,therewillbenobodytohandletheevents
32//anyway,sojusthangoninwhateverstatewe'reinuntilthingssettledown.
33WindowStatewin=mFocusedWindow!
=null?
mFocusedWindow:
mTopFullscreenOpaqueWindowState;
34if(win==null){
35return0;
36}
37if(win.getAttrs().type==TYPE_KEYGUARD&&mHideLockScreen==true){
38//Weareupdatingatapointwherethekeyguardhasgotten
39//focus,butwewerelastinastatewherethetopwindowis
40//hidingit.Thisisprobablybecausethekeyguardasbeen
41//shownwhilethetopwindowwasdisplayed,sowewanttoignore
42//itherebecausethisisjustaverytransientchangeandit
43//willquicklylosefocusonceitcorrectlygetshidden.
44return0;
45}
46
47inttmpVisibility=win.getSystemUiVisibility()
48&~mResettingSystemUiFlags
49&~mForceClearedSystemUiFlags;
50if(mForcingShowNavBar&&win.getSurfaceLayer() 51tmpVisibility&=~View.SYSTEM_UI_CLEARABLE_FLAGS; 52} 53finalintvisibility=updateSystemBarsLw(win,mLastSystemUiFlags,tmpVisibility); 54finalintdiff=visibility^mLastSystemUiFlags; 55finalbooleanneedsMenu=win.getNeedsMenuLw(mTopFullscreenOpaqueWindowState); 56if(diff==0&&mLastFocusNeedsMenu==needsMenu 57&&mFocusedApp==win.getAppToken()){ 58return0; 59} 60mLastSystemUiFlags=visibility; 61mLastFocusNeedsMenu=needsMenu; 62mFocusedApp=win.getAppToken(); 63mHandler.post(newRunnable(){ 64@Override 65publicvoidrun(){ 66try{ 67IStatusBarServicestatusbar=getStatusBarService(); 68if(statusbar! =null){ 69statusbar.setSystemUiVisibility(visibility,0xffffffff); 70statusbar.topAppWindowChanged(needsMenu); 71} 72}catch(RemoteExceptione){ 73//re-acquirestatusbarservicenexttimeitisneeded. 74mStatusBarService=null; 75} 76} 77}); 78returndiff; 79} c)各种按键事件的拦截和分发(比如长按home键) Home键的事件是在phonewindow这一层就拦截的,所以一般情况应用本身无法正常拦截该事件。 80privatevoidhandleLongPressOnHome(){ 81if(mLongPressOnHomeBehavior! =LONG_PRESS_HOME_NOTHING){ 82mHomeConsumed=true; 83performHapticFeedbackLw(null,HapticFeedbackConstants.LONG_PRESS,false); 84 85if(mLongPressOnHomeBehavior==LONG_PRESS_HOME_RECENT_SYSTEM_UI){ 86toggleRecentApps(); 87}elseif(mLongPressOnHomeBehavior==LONG_PRESS_HOME_ASSIST){ 88launchAssistAction(); 89} 90} 91} d)锁屏事件处理和响应 92publicvoidsystemReady(){ 93if(! mHeadless){ 94mKeyguardDelegate=newKeyguardServiceDelegate(mContext,null); 95mKeyguardDelegate.onSystemReady(); 96} 97synchronized(mLock){ 98updateOrientationListenerLp(); 99mSystemReady=true; 100mHandler.post(newRunnable(){ 101@Override 102publicvoidrun(){ 103updateSettings(); 104} 105}); 106} 107} 2.KeyguardServiceDelegate.java和KeyguardServiceWrapper.java 这两个类是android4.4新增加的,分别对KeyguardService进行了代理和包装,代理类里面有一个Scrim视图在keyguard崩溃时显示。 包装类就是对keyguardService的简单包装,最终把调度都会传给keyguardService。 3.keyguardService.java 上面一再说到该类,那么它有啥出众的地方呢,其实它就是keyguard的入口,锁屏所有的往生都因它而起,这个类很简单,实例化了一个IKeyguardService.Stub供其他类bindservice时调用,需要特别注意的是整个keyguard的核心实力派KeyguardViewMediator在这里诞生了。 4.KeyguardViewMediator.java 字面上的意思是keyguard视图调度者,功能上是负责处理keyguard视图的事件,比如完成锁屏和解锁这些动作的视图响应,它作为一个位高权重的调度使当然不会亲手去做这些,它有个得力干将KeyguardviewManager,所有的大小任务都会放权给它。 108/** 109*有关锁屏请求的调度者。 包括锁屏状态的查询,powermanagement事件影响锁屏是否应该被显示或者重置,特定的回调函数来 110*通知windowmanager锁屏是什么时候显示,以及接受view视图传过来的消息表明已经成功完成解锁。 111*请注意锁屏是在灭屏后立即被调用显示的。 这样当你点亮屏幕,锁屏才能第一时间显示出来。 112*例如外部事件调度锁屏视图流程: 113* 114*-灭屏动作-》重置锁屏并显示它为下次点亮屏幕做好准备。 115*-锁屏很自然流畅的打开了-》如果他不是安全的,隐藏之。 116* 117*来自于锁屏视图的事件: 118*-用户成功完成解锁条件-》隐藏锁屏视图,不再对输入事件进行拦截。 119*请再注意: 第三方应用通过条用powermanagment实例可以屏蔽系统的锁屏。 120* 121*线程和同步: 122*该类是由WindowManagerPolicy创建并运行在它的线程里,锁屏UI也是这个类的构造函数里面产生。 这个apis也可以被其他线程所调用。 123*然而,这个类的方法手势同步的,同时任何一个锁屏视图都会发消息到handle来保证它是在锁屏UI线程里面执行的。 124*/ 125 126publicclassKeyguardViewMediatorimplementsKeyguardViewCallback, 127KeyguardUpdateMonitor.InfoCallback,KeyguardUpdateMonitor.SimStateCallback{ 128privatestaticfinalintKEYGUARD_DISPLAY_TIMEOUT_DELAY_DEFAULT=30000; 129/** 130*Thishandlerwillbeassociatedwiththepolicythread,whichwillalso 131*betheUIthreadofthekeyguard.Sincetheapisofthepolicy,andtherefore 132*thisclass,canbecalledbyotherthreads,anyactionthatdirectly 133*interactswiththekeyguarduishouldbepostedtothishandler,rather 134*thancalleddirectly. 135*/ 136privateHandlermHandler=newHandler(){ 137@Override 138publicvoidhandleMessage(Messagemsg){ 139switch(msg.what){ 140caseTIMEOUT: 141handleTimeout(msg.arg1); 142return; 143caseSHOW: 144handleShow(); 145return; 146caseHIDE: 147handleHide(); 148return; 149caseRESET: 150handleReset(); 151return; 152caseVERIFY_UNLOCK: 153handleVerifyUnlock(); 154return; 155caseNOTIFY_SCREEN_OFF: 156handleNotifyScreenOff(); 157return; 158caseNOTIFY_SCREEN_ON: 159handleNotifyScreenOn((KeyguardViewManager.ShowListener)msg.obj); 160return; 161caseWAKE_WHEN_READY: 162handleWakeWhenReady(msg.arg1); 163return; 164caseKEYGUARD_DONE: 165handleKeyguardDone(msg.arg1! =0); 166return; 167caseKEYGUARD_DONE_DRAWING: 168handleKeyguardDoneDrawing(); 169return; 170caseKEYGUARD_DONE_AUTHENTICATING: 171keyguardDone(true); 172return; 173caseSET_HIDDEN: 174handleSetHidden(msg.arg1! =0); 175break; 176caseKEYGUARD_TIMEOUT: 177synchronized(KeyguardViewMediator.this){ 178doKeyguardLocked(); 179} 180break; 181} 182} 183}; 184privatevoidadjustStatusBarLocked(){ 185......//控制是否能在锁屏界面下拉状态栏。 186} 187} 5.KeyguardViewManager.java 如果说mediator相当于总裁,那这个就是经理,而且是视图部门老大,它有一个类型为FrameLayout名叫ViewManager的内部类,用来作为keyguard的viewroot。 在viewroot里添加了KeyguardHostView,我们叫它mKeyguardView。 Keyguard里任何的view细节和问题都能通过它找到蛛丝马迹。 188/** 189*Managescreating,showing,hidingandresettingthekeyguard.Callsback 190*via{@linkKeyguardViewMediator.ViewMediatorCallback}topoke 191*thewakelockandreportthatthekeyguardisdone,whichisinturn, 192*reportedtothisclassbythecurrent{@linkKeyguardViewBase}. 193*/ 194publicclassKeyguardViewManager{ 195privatefinalstaticbooleanDEBUG=KeyguardViewMediator.DEBUG; 196privatestaticStringTAG="KeyguardViewManager"; 197publicstaticbooleanUSE_UPPER_CASE=true; 198publicfinalstaticStringIS_SWITCHING_USER="is_switching_user"; 199 200//Timeoutusedforkeypresses 201staticfinalintDIGIT_PRESS_WAKE_MILLIS=5000; 202 203privatefinalContextmContext; 204privatefinalViewManagermViewManager; 205privatefinalKeyguardViewMediator.ViewMediatorCallbackmViewMediatorCallback; 206 207privateWindowManager.LayoutParamsmWindowLayoutParams; 208privatebooleanmNeedsInput=false; 209 210privateViewManagerHostmKeyguardHost; 211privateKeyguardHostViewmKeyguardView; 6.KeyguardHostVIew.java 这里完成keyguardView布局,实例化。 分析一个自定义的viewgroup,重点需要分析的是它的构造方法和onFinishInflate()方法: 212publicKeyguardHostView(Contextcontext,AttributeSetattrs){ 213super(context,attrs); 214 215if(DEBUG)Log.e(TAG,"KeyguardHostView()"); 216 217mLockPatternUtils=newLockPatternUtils(context); 218 219//Note: ThisdependsonKeyguardHostViewgettingreconstructedeverytimethe 220//user
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android44 42keyguard锁屏流程梳理 42 keyguard 流程 梳理