SystemUI_Keyguard

一般情况下,SystemUI启动完成之后,进入的第一个界面为锁屏界面;

锁屏keyguard属于SystemUI,keyguard大致分为两个部分:

  • keyguard模块的启动;
  • WMS处理锁屏显示流程;

keyguard

keyguard模块中,存在几个核心的类:

  • KeyguardViewMediator:继承SystemUI,是keyguard的核心类,是交互的中转类,其他对象都是通过KeyguardViewMediator对象相互交互;
  • KeyguardUpdateMonitor:状态回调的管理类;
  • KeyguardBouncer:锁屏view的通信交互类;
  • KeyguardService:用于跨进程交互;

KeyguardViewMediator

SystemUI 启动

在SystemUI启动的过程中,SystemUIApplication中对config配置文件中解析出来的SystemUI组件进行反射创建实例,其中就包含了KeyguardViewMediator组件;

创建好KeyguardViewMediator实例后,调用该组件的start方法进行初始化操作,在该过程中,创建了KeyguardDisplayManager实例,用于后续锁屏界面显示逻辑的处理;

WakeLock:唤醒锁,用于点亮屏幕;

开机首次锁屏显示

SystemUI启动完成之后,会直接调用WMS的onSystemUiStarted方法,通知WMS SystemUI已经初始化完成,WMS可以开始bind锁屏服务,开始准备后续需要使用到的锁屏服务;

当WMS bind成功KeyguardService之后,在后续的逻辑中会执行WMS的一些逻辑,当WMS模块的初始化和关联逻辑执行完成之后,会调用WMS的systemReady方法代表WMS已经准备就绪;

在这个过程中,会调用KeyguardService的onSystemReady,而在KeyguardViewMediator中,所有的任务都是通过Handler的信息执行的,通过sendMessage发送对应的消息 ,该过程对应的Message = SYSTEM_READY;

息屏 & 亮屏 锁屏

参考:息屏与亮屏

锁屏逻辑

无论是开机首次显示锁屏,还是后续的息屏亮屏显示锁屏,其对应的锁屏逻辑都是一样的;

在doKeyguardLocked方法中,大致执行了两个逻辑:

  • 判断当前的系统环境是否支持锁屏服务或者是锁屏功能;

    • 判断是否有其他app阻止锁屏界面显示,例如通话功能;
    • 判断是否已经处于锁屏界面;
    • 判断设置配置或者SIM卡配置是否支持锁屏界面;
  • 执行锁屏逻辑;

上述判断的阻止锁屏界面显示的条件都不满足的话,就会执行到showLocked方法,在这个方法中,就是真正执行锁屏逻辑的过程;

禁止锁屏方法

所有的禁止锁屏的方案,其本质上都是通过在doKeyguardLocked方法中中断后续显示锁屏界面的逻辑实现的。实现方案可以分为:

  • 自定义中断条件;
  • 使用Android原生的中断条件;

关闭锁屏服务 + 禁止doKeyguardLocked

SystemUIApplication#onCreate()

scss 复制代码
if (!getResources().getBoolean(R.bool.config_enableKeyguard)) {
    Log.v(TAG, "SystemUI disable Keyguard.");
    new android.os.Handler().post(new Runnable() {
        @Override
        public void run() {
            KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
            KeyguardManager.KeyguardLock keyguardLock = km.newKeyguardLock(TAG);
            keyguardLock.disableKeyguard();
        }
    });
}

config_car.xml

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="config_enableKeyguard">false</bool>
</resources>

KeyguardViewMediator#dokeyguardLocked

arduino 复制代码
private void doKeyguardLocked(Bundle options) {
    if (!mContext.getResources().getBoolean(R.bool.config_enableKeyguard)) {
        Log.d(TAG, "doKeyguard: disable Keyguard.");
        return;
    }
    ......
}

移除Keyguard组件 + 禁用KeyguardService + 禁止doKeyguardLocked

config_car.xml

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="config_enableKeyguard">false</bool>
​
    <!-- The list of components to exclude from config_systemUIServiceComponents. -->
    <string-array name="config_systemUIServiceComponentsExclude" translatable="false">
        <item>com.android.systemui.keyguard.KeyguardViewMediator</item>
    </string-array>
</resources>

KeyguardService

arduino 复制代码
private final IKeyguardService.Stub mBinder = new IKeyguardService.Stub() {
    /**
     * 所有的方法都空实现
     *
     */
}

KeyguardViewMediator#dokeyguardLocked

arduino 复制代码
private void doKeyguardLocked(Bundle options) {
    if (!mContext.getResources().getBoolean(R.bool.config_enableKeyguard)) {
        Log.d(TAG, "doKeyguard: disable Keyguard.");
        return;
    }
    ......
}

LockPatternUtils禁用锁屏 + 禁用KeyguardService

这个方案是在模拟器上面使用的方案,这个值会被设置到SQLite数据库中进行保存;

KeyguardViewMediator#setupLocked

scss 复制代码
private void setupLocked() {
    setLockScreenDisabled(mContext.getResources().getBoolean(R.bool.config_disableKeyguard));
    ..................
}
​
private void setLockScreenDisabled(boolean disable) {
    if (disable) {
        if (DEBUG) Log.d(TAG, "setLockScreenDisabled: not showing because lockscreen is off");
        mLockPatternUtils.setLockScreenDisabled(disable, 0);
    }
}

config_car.xml

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="config_disableKeyguard">true</bool>
</resources>

config.xml

xml 复制代码
<!-- Whether to enable KeyguardService or not -->
<bool name="config_enableKeyguardService">false</bool>
相关推荐
Estar.Lee22 分钟前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
javaDocker1 小时前
业务架构、数据架构、应用架构和技术架构
架构
找藉口是失败者的习惯1 小时前
从传统到未来:Android XML布局 与 Jetpack Compose的全面对比
android·xml
Jinkey2 小时前
FlutterBasic - GetBuilder、Obx、GetX<Controller>、GetxController 有啥区别
android·flutter·ios
JosieBook3 小时前
【架构】主流企业架构Zachman、ToGAF、FEA、DoDAF介绍
架构
.生产的驴4 小时前
SpringCloud OpenFeign用户转发在请求头中添加用户信息 微服务内部调用
spring boot·后端·spring·spring cloud·微服务·架构
大白要努力!4 小时前
Android opencv使用Core.hconcat 进行图像拼接
android·opencv
丁总学Java4 小时前
ARM 架构(Advanced RISC Machine)精简指令集计算机(Reduced Instruction Set Computer)
arm开发·架构
天空中的野鸟5 小时前
Android音频采集
android·音视频