关于解锁和锁屏

news/2024/11/8 14:08:37/

解锁、锁屏界面状态改变、锁屏(开机锁屏、时间超时锁屏、按power键锁屏)
一、解锁。以划动解锁(LockScreen.java)为例

   1
、划动解锁触发其控件监听方法onTriggeronTrigger方法再调用对象mCallback.goToUnlockScreen()
   
   2
、在LockPatternKeyguardView的构造函里创建一个KeyguardScreenCallback的对象mKeyguardScreenCallback,并实现KeyguardScreenCallback的所有抽象方法。
   
      LockPatternKeyguardView
mKeyguardScreenCallback当作LockScreen的构造函数的参数,LockScreen把该参数赋值给mCallback,所以mCallback==mKeyguardScreenCallback
      
   3
KeyguardScreenCallback的抽象方法goToUnlockScreen的具体实现是:getCallback().keyguardDone(false)
   
      KeyguardViewMediator
当作KeyguardViewManager的构造函数的参数传给KeyguardViewManager
      
      
然后在创建LockPatternKeyguardView对象mKeyguardViewmKeyguardView= 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.InfoCallbackonTimeChanged()方法。
    

    LockScreen的构造函数里面通过执行updateMonitor.registerInfoCallback(this)LockScreen注册到KeyguardUpdateMonitor的观察对象列表。
    

    KeyguardUpdateMonitor注册了一个BroadcastReceiver用于监听时间、信号、电量等界面信息的变化。当时间发生变化时,BroadcastReceiver接收到Intent.ACTION_TIME_CHANGED
    

    之后发出消息MSG_TIME_UPDATEHandler接收到MSG_TIME_UPDATE后执行handleTimeUpdate(),在handleTimeUpdate里面代码如下:
    

    for (int i = 0; i < mInfoCallbacks.size(); i++) {
       mInfoCallbacks.get(i).onTimeChanged();
     }循环调用观察对象的onTimeChanged方法。
     
三、锁屏(开机锁屏、时间超时锁屏、按power键锁屏)
    A
、开机锁屏
    

      当系统初始化完成后会调用wmWindowManagerService.java.systemReady()函数,触发解锁界面。
      
     --->PhoneWindowManager.systemReady()--->mKeyguardMediator(KeyguardViewMediator.java).onSystemReady()
      
     -->mKeyguardMediator.doKeyguard()-->mKeyguardMediator.showLocked(){Messagemsg = 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,intdelaytime)实现timeout机制。
      
注:TimeoutTask.javaPowerManagerService.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);
       }
       

       mLockScreenTimeoutsettings里设置的屏幕超时时间,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(longtime)}--->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 lockscreentimer");
                   mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout);
                } else {
                   if (true) Log.v("cai", "clearing lockscreentimer");
                   mHandler.removeCallbacks(mScreenLockTimeout);//
mScreenLockTimeout从消息对列中去掉
                }
               mLockScreenTimerActive = enable;//
设置屏幕超时的timer失效
            }
        }
    }
     
    

 


http://www.ppmy.cn/news/484352.html

相关文章

好玩的linux命令--cmatrix炫酷屏保软件

好玩的linux命令--cmatrix炫酷屏保软件 链接:https://pan.baidu.com/s/1837d9HjUg6Ek8RxOa9ohAg 密码:vuzh tar xvf cmatrix-1.2a.tar.gz cd cmatrix-1.2a yum install ncurses-devel ./configure && make && make install make 安装失败&#xff0c;可以运…

Java做的锁屏小软件

BJ锁屏(JLocker) 【功能】 锁屏软件&#xff0c;输入密码&#xff0c;回车&#xff0c;确认密码&#xff0c;回车即可锁屏。 【JLocker最新版】 说明&#xff1a;版本号1.6。 地址&#xff1a;http://good.gd/2020806.htm 【JLocker历史版本】 |——Version1.4及以前&am…

Android O版本power按键锁屏亮屏流程

今天记录下跟踪的Android O版本&#xff0c;power键按下流程&#xff0c;包括关机&#xff0c;锁屏&#xff0c;亮屏流程&#xff0c;没有太多新的扩展&#xff0c;只是做了源码流程的记录分析&#xff0c;若有异议&#xff0c;欢迎提出&#xff0c;下面开始 ##power按键传递 对…

prisma 结合 mongodb 查询地理空间坐标,实现 “附近的人”功能

前言&#xff1a;我们创建一个集合&#xff0c;添加测试数据&#xff0c;并执行 mongodb 的地理空间查询&#xff0c;返回需要的数据。 1、通过schema.prisma, 创建 store 集合 2、通过 prisma/client &#xff0c;插入 几条测试数据 // 构造测试数据createList: async () >…

如何修改Linux的锁屏时间,调整Kali Linux的锁屏时间

调整Kali Linux的锁屏时间 锁屏是保护隐私的一种重要机制。当用户不操作电脑一段时间后,系统会进入锁屏状态。用户需要输入口令,才能重新进入系统。避免因为操作人员离开电脑后,被其他人员利用现有帐号权限对电脑进行操作。Kali Linux的锁屏是和黑屏功能是关联的。默认设置是…

js实现一个简单的锁屏功能

//********* 锁屏DIV *************************** function LockScreen(tag,title,width,height,url) { if (tag) //锁屏 { var lockdiv document.getElementById("lockscreen"); if (lockdiv!null) { lockdiv.style…

Android WallpaperManager 同时设置桌面壁纸与锁屏的问题

最近项目中&#xff0c;需要给手机设置桌面壁纸与锁屏。 大家都知道使用 WallpaperManager.setStream()方法就好 RequiresPermission(android.Manifest.permission.SET_WALLPAPER) public int setStream(InputStream bitmapData, Rect visibleCropHint,boolean allowBackup, …

使用CiLocks绕过Android的锁屏功能

关于CiLocks CiLocks是一款功能强大的Android渗透测试工具&#xff0c;在该工具的帮助下&#xff0c;研究人员可以轻松绕过Android设备的锁屏保护。 功能介绍 爆破四位PIN码&#xff1b; 爆破六位PIN码&#xff1b; 使用字典爆破锁屏密码&#xff1b; 绕过锁屏保护&#xff0…