锁屏流程演讲_第1页
锁屏流程演讲_第2页
锁屏流程演讲_第3页
锁屏流程演讲_第4页
锁屏流程演讲_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

锁屏界面

CompanyLogo锁屏界面介绍菜单锁屏界面组成锁屏显示规则锁屏启动流程个人总结

锁屏界面组成:LockScreen:滑动锁(系统默认的波纹锁)如下图:该界面对应自定义View是LockScreen.java类路径位于: frameworks\policies\base\phone\com\android\internal\policy\impl\LockScreen.javaUnLockScreen:进入手机设置-->安全-->屏幕锁定(在列表中可以选择:图案、密码、Pin等锁屏都是UnLockScreen)图案开锁界面PatternUnlockScreen.java路径位于: frameworks\policies\base\phone\com\android\internal\policy\impl显示规则这两种界面的组合也是有很多变化的,总的规则如下:首先显示LockScreen界面,接着判断是否开启了UnLockScreen界面,如果设置了UnLockScreen界面,则进入对应的UnLockScreen界面去解锁,才算成功解锁。但,存在一种特殊的情况,就是假如我们选择了图UnLockScreen界面,是不会显示LockScreen界面,而只会显示UnLockScreen界面。修改后规则,首先判断是否有新的sim卡或者无sim卡状态,如果是这两种状态,启动设计的模式。接着调用KeyguardViewMediator类中的onSystemReady()方法,代码如下: publicclassKeyguardViewMediatorimplementsKeyguardViewCallback,KeyguardUpdateMonitor.InfoCallback,KeyguardUpdateMonitor.SimStateCallback{ publicvoidonSystemReady(){synchronized(this){if(DEBUG)Log.d(TAG,"onSystemReady");mSystemReady=true;doKeyguardLocked();//zzt}} 接着调用KeyguardViewMediator.doKeyguardLocked(); 方法,在该方法中需要判断是否满足直接返回,如果不则调用KeyguardViewMediator.showLock()方法代码如下:锁屏启动流程分析手机开机时,在SystemServer类的init2()方法启动线程类ServerThread的run()方法,代码如下:classServerThreadextendsThread{WindowManagerServicewm=null; run(){ try{wm.systemReady();//zzt}catch(Throwablee){reportWtf("makingWindowManagerServiceready",e);} }}从上述代码中的wm为WindowManagerService的引用,wm.systemReady()为调用WindowManagerService的systemReady()方法,代码如下:publicclassWindowManagerServiceextendsIWindowManager.StubimplementsWatchdog.Monitor,WindowManagerPolicy.WindowManagerFuncs{ finalWindowManagerPolicymPolicy=PolicyManager.makeNewWindowManager();//zzt publicvoidsystemReady(){ mPolicy.systemReady();//zzt } } WindowManagerPolicy实现类是PhoneWindowManager,间接的调用systemReady();代码如下:publicclassPhoneWindowManagerimplementsWindowManagerPolicy{ publicvoidsystemReady(){//tellthekeyguardmKeyguardMediator.onSystemReady();//zzt重点android.os.SystemProperties.set("dev.bootcomplete","1");synchronized(mLock){updateOrientationListenerLp();mSystemReady=true;mHandler.post(newRunnable(){publicvoidrun(){updateSettings();}});}}privatevoidshowLocked(){if(DEBUG)Log.d(TAG,"showLocked");//ensurewestayawakeuntilwearefinisheddisplayingthekeyguardmShowKeyguardWakeLock.acquire();//zzt确保屏//幕唤醒状态Messagemsg=

mHandler.obtainMessage(SHOW);//zzt发送消息mHandler.sendMessage(msg);}通过Handler发送消息SHOW到handMessage()处理,代码如下:

privateHandlermHandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){switch(msg.what){caseSHOW:handleShow();return;caseHIDE:handleHide();return;caseRESET:handleReset();return;break;}}};调用handleShow()方法去操作锁屏的显示,代码如下:privatevoidhandleShow(){synchronized(KeyguardViewMediator.this){if(DEBUG)Log.d(TAG,"handleShow");if(!mSystemReady)return;mKeyguardViewManager.show();//zztmShowing=true;adjustUserActivityLocked();adjustStatusBarLocked();try{ActivityManagerNative.getDefault().closeSystemDialogs("lock");}catch(RemoteExceptione){}//Dothisattheendtonotslowdowndisplayofthekeyguard.playSounds(true);mShowKeyguardWakeLock.release();} 接着调用KeyguardViewManager.show()方法,而show中判断KeyguardViewHost(mKeyguardHost)和LockPatternKeyguardViewProperties(mKeyguardView)是否为空进行判断。

1)如果KeyguardViewHost为空,就创建KeyguardViewhost,同时设置更新相关的布局参数。然后根据将KeyguardViewHost对象添加到WindowManagerImpl中。2)如果LockPatternKeyguardview为空,创建LockpatternKeyguardView对象,通过调用LockPatternKeyguardviewProperties.createKeyguardView()创建。同时为它设置回调。然后将创建得到的对象添加到KeyguardViewhost,代码如下:publicsynchronizedvoidshow(){ if(mKeyguardHost==null){ mKeyguardHost=new KeyguardViewHost(mContext,mCallback); mViewManager.addView(mKeyguardHost,lp);} if(mKeyguardView==null){ mKeyguardView= mKeyguardViewProperties.createKeyguardView(mContext,mUpdateMonitor,this);mKeyguardHost.addView(mKeyguardView,lp);if(mScreenOn){mKeyguardView.show(); }}在上面的代码中,当KeyguardViewHost为空时,首先会调用KeyguardviewProperties的实现类LockPatternKeyguardviewProperties的createKeyguardView的方法,来构造一个LockPatternKeyguardview对象,如下:publicLockPatternKeyguardViewProperties(LockPatternUtilslockPatternUtils,KeyguardUpdateMonitorupdateMonitor){mLockPatternUtils=lockPatternUtils;mUpdateMonitor=updateMonitor;}publicKeyguardViewBasecreateKeyguardView(Contextcontext,KeyguardUpdateMonitorupdateMonitor,KeyguardWindowControllercontroller){returnnewLockPatternKeyguardView(context,updateMonitor,mLockPatternUtils,controller);}而在LockPattenKeyguardView的构造函数中,有如下调用publicclassLockPatternKeyguardViewextendsKeyguardViewBaseimplementsHandler.Callback,KeyguardUpdateMonitor.InfoCallback{ updateScreen(getInitialMode(),false);}getInitialMode()得到当前锁屏模式(lockorunLock),代码如下:privateModegetInitialMode(){finalIccCard.StatesimState=mUpdateMonitor.getSimState();if(stuckOnLockScreenBecauseSimMissing()||(simState==IccCard.State.PUK_REQUIRED&&!mLockPatternUtils.isPukUnlockScreenEnable())){returnMode.LockScreen;}else{if(!isSecure()||mShowLockBeforeUnlock){returnMode.LockScreen;}else{returnMode.UnlockScreen;}}}上面的updateScreen(getInitialMode(),false),该函数的实现代码如下: privatevoidupdateScreen(Modemo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论